Node.js / Express:防止直接从URL加载AJAX HTML片段

我正在用Node.js,Express和MongoDB构build博客。

在主页上我有一个button来加载更多的职位。 这工作正常,我用下面的代码完成它:

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片段。 我想这是应该的,但我不想退还。 我不认为这是一个安全隐患,似乎有点不雅。

有没有办法阻止对这个观点的直接要求?

奖金

这是另外一件奇怪的事情,并且使这个问题成为一个两部分问题。 当我检查if语句中的空post数组时,Node将忽略它。 控制台输出显示posts = []但它跳过它,然后在lastDate = posts.slice(-1)[0].publish_date; 我知道JS的行为有趣的空值(空,未定义,空string等),但我已经尝试不同的结果相同。 这似乎是完全忽略它。 我服用疯狂的药片吗?

有没有办法阻止对这个观点的直接要求?

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

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

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

至于你的其他问题, [] === []实际上是假的(就像是[] == [] ),所以这不是一个好方法来看看一个数组是否是空的。 我build议你使用:

 if (!posts || posts.length === 0) { // empty } 

您可以使用会话(在主页面中初始化)来保护您的摘要。
在路由前添加一个中间件到中间件,中间件检查会话标记,并在没有find会话的情况下redirect。
这与通过login保护数据的系统几乎相同,并且每个用户的主页都会自动login。

我可以为你拿一些例子,如果你需要的话留下评论。

[奖金]

你有没有试过posts == [] posts.length === 0而不是posts === []