1

我正在用 Node.js、Express 和 MongoDB 构建一个博客。

在主页上,我有一个按钮来加载更多帖子。这工作正常,我用以下代码完成它:

jQuery

$("#load-more-posts").click(function() {
    $.ajax({
        url: '/load/posts/',
        type: 'get',
        dataType: 'html',
        success: function(data) {
            $("#primary").append(data);
        },
        data: {"passLastDate": lastDate}
    });

    return false;
});

这是app.js中的路线

app.get("/load/posts", routes.loadPosts);

这是视图:

loadPosts: function(req, res) {
  var lastDate;
  lastDate = req.query.passLastDate;
  return Post.find({
    "published": true,
    "publish_date": {
      $lt: lastDate
    }
  }).sort('-publish_date').limit(1).execFind(function(err, posts) {
    if (posts === []) {
      console.log("thats it");
      return res.render("thats-it", {
        layout: false
      });
    } else {
      lastDate = posts.slice(-1)[0].publish_date;
      return res.render("more-posts", {
        layout: false,
        posts: posts,
        lastDate: lastDate
      });
    }
  });
}

就像我说的,这一切都很好。但是,如果我从控制台复制 GET url 并将其直接粘贴到浏览器中,我会得到一个返回的 HTML 片段。我想这是应该的,但我不想退回它。我不认为这是一个安全隐患,只是看起来有点不雅。

有没有办法阻止对该视图的直接请求?

奖金

这里还有一些奇怪的东西,这使它成为一个由两部分组成的问题。当我在语句中检查一个空的 post 数组时if,Node 会忽略它。控制台输出显示posts = []但它直接跳过它,然后抛出一个错误lastDate = posts.slice(-1)[0].publish_date;我知道 JS 对空值(null、未定义、空字符串等)的行为很有趣,但我尝试了不同的结果相同。它似乎完全无视它。我在吃疯狂的药吗?

4

2 回答 2

4

有没有办法阻止对该视图的直接请求?

您可以通过检查x-requested-with标头(jQuery 发送的)来检查请求是否是使用 AJAX 调用执行的:

loadPosts: function(req, res) {
  if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
    // AJAX request
  }
  else {
    // not an AJAX request
  }
}

这不应该用作安全措施(因为它不是),而只是作为检查请求是否使用 AJAX 发出的一种方式。

至于您的其他问题,[] === []实际上是错误的(原样[] == []),因此这不是查看数组是否为空的好方法。我建议你使用:

if (!posts || posts.length === 0) {
  // empty
}
于 2013-03-27T07:32:43.220 回答
1

您可以使用会话(在主页中初始化)来保护您的片段。
在到片段的路由之前添加一个中间件,中间件检查会话令牌并在未找到会话时重定向。
它几乎与具有受登录保护的数据的系统相同,并且您的主页会自动为每个用户登录。

我可以为您获取一些示例,如果您需要,请发表评论。

[奖金]

您是否尝试过posts == [] posts.length === 0代替posts === []

于 2013-03-27T07:28:42.203 回答