我正在使用节点中的某些数组,我想将if作为一个JSON对象发送到前端。我用express来做这件事。我有一个名为User的模型,我根据他们的电子邮件找到用户。该电子邮件以数组形式提供。我确实得到了用户对象但我无法创建一个JSON对象!
我尝试了一些中间件但是没有给我任何结果! https://www.npmjs.com/package/node.extend
var users = {};
for (var i = 0; i <emails.length; i++) {
User.findOne({
'email': project.students[i]
}, function (err, user) {
if (err) {
res.send(err);
}
// Fill the users object with each user found based on the email
});
}
console.log(users); // Should be one JSONObject
感谢您的帮助!
答案 0 :(得分:2)
您应该可以在一个查询中执行此操作。看起来你正在使用猫鼬,所以尝试这样的事情:
User.find({ email: { $in: emails } }, function(err, results) {
if (err) return res.send(err);
res.send(results);
});
值得注意的是,javascript是单线程的。这意味着许多操作是异步发生的,这意味着您必须等待操作完成才能继续。上面的控制台日志记录语句不等待数据库操作完成。您必须等待回调函数执行。
更新:还注意到您正在循环emails
,但在每次迭代中使用project.students[i]
。我看不到你的其余代码,但这只是错误的代码。您应该在每次迭代中使用project.students
循环遍历emails[i]
或。
更新2:您似乎想要发送的不只是响应用户数组。因此,第一个目标是使用$in
运算符使用单个查询(请参阅上面的示例 - 您应该能够将电子邮件列表传递给mongoose)。任何与mongo相关的东西,如果您完全关心性能,总是希望减少对数据库的查询量。第二项任务是相应地重新格式化您的用户和其他数据:
var finalResponse = { token: "12341234", users: null };
User.find({ email: { $in: emails } }, function(err, results) {
if (err) return res.send(err);
if (!results.length) return res.send(finalResponse);
// OPTION 1: Array of users (recommended)
finalResponse.users = results;
// OPTION 2: users object, keyed by the users email
finalResponse.users = {};
results.forEach(function(user) {
finalResponse.users[user.email] = user;
});
// FINALLY, send the response
resp.send(finalResponse);
});