Node.js 在mongoose查询返回集合之前,应用程序应该如何处理http get响应?
My Node.JS应用程序通过http GET route处理程序中的mongoose模型对mongo数据库执行查询Node.js 在mongoose查询返回集合之前,应用程序应该如何处理http get响应?,node.js,express,mongoose,Node.js,Express,Mongoose,My Node.JS应用程序通过http GET route处理程序中的mongoose模型对mongo数据库执行查询 var users; var usersArray; router.get('/', function(req, res) { userModel.find().exec(function(err, userDocs) { if (err) { console.log(err); }
var users;
var usersArray;
router.get('/', function(req, res) {
userModel.find().exec(function(err, userDocs) {
if (err) {
console.log(err);
} else {
userArray = _.toArray(userDocks);
users = userDocs;
}
});
res.render('users', { users: { length: usersArray.length, users: users }
});
});
Mongoose查询返回JS承诺。处理此时间延迟的常见场景是什么?您应该根据mongoose查询的回调结果来处理结果。这确保您根据结果返回正确的响应状态 在Node.js中,最好在响应客户端之前
返回
,例如:
返回res.status(200).send()
return
保证当前上下文中的执行将停止并返回return
后面语句的结果。即使我们没有对return
的结果做任何处理,它也保证一旦我们响应用户,我们就不会在该上下文中继续执行。这将防止代码尝试响应两次,这将导致异常
router.get('/', function(req, res) {
userModel.find().exec(function(err, userDocs) {
if (err) {
console.log(err);
return res.status(400).json(err)
}
return res.render('users', {
users: {
length: _.toArray(userDocs).length,
users: tournamentDocs
}
});
});
});
});
我应该同时返回状态代码200和数据吗?或者res.render(…)负责正确的状态代码响应?@MatkoKlaic无需执行
res.status(200).render()
。执行res.render()
时,您告诉Express view engine编译模板以及任何数据,并将其发送回状态代码为200的客户端。考虑到“typeof userDocs”返回“object”,将userDocs传递给view engine是正确的,还是应该u.toArray(userDocs)是否通过?这取决于您希望如何处理数据。我只返回userDocs
并在模板中处理该数据,而不是在res.render()
语句中转换它。@MatkoKlaic yes,还要注意的是,当执行typeof userDocs
时,userDocs是一个数组,object
将作为类型返回。