我正在使用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代码段。我想这应该是应该的,但我不想归还它。我不认为这是一个安全隐患,只是看起来有点不雅。
有没有办法阻止对此视图的直接请求?
奖金
这是另外一些奇怪的事情,并且这是一个由两部分组成的问题。当我在if
语句中检查空的post数组时,Node会忽略它。控制台输出显示posts = []
但它跳过它然后在lastDate = posts.slice(-1)[0].publish_date;
上抛出错误我知道JS表现得很有趣,空值(null,undefined,空字符串等)但是我已经尝试了不同的结果。似乎它完全无视它。我服用疯子吗?
答案 0 :(得分: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
}
答案 1 :(得分:1)
您可以使用会话(在主页面中初始化)来保护您的代码段
在路由到片段之前添加中间件,中间件检查会话令牌并在没有找到会话时重定向。
它与具有受登录保护的数据的系统几乎相同,并且您的主页面会自动为每个用户登录。
我可以为您提供一些示例,如果您需要,请发表评论。
[BONUS]
您是否尝试过 posts == []
或posts.length === 0
而不是posts === []
?