NodeJS从数组创建json对象

时间:2014-12-15 20:08:42

标签: arrays json node.js

我正在使用节点中的某些数组,我想将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

感谢您的帮助!

1 个答案:

答案 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);
});