2014-12-15 2 views
-2

Я работаю с некоторыми массивами в узле, и я хочу отправить, если в качестве одного объекта JSON для интерфейса. Я использую выражение для этого. У меня есть модель под названием User, где я нахожу пользователей на основе их электронной почты. Это письмо предоставляется в массиве. Я получаю объект пользователя, но я не могу создать из него один объект JSON!NodeJS создать объект 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

Вы определяете 'users' как объект, почему вы ждете его становится массивом? –

ответ

2

Вы должны быть в состоянии сделать это в одном запросе. Похоже, что вы используете мангуст, поэтому попробовать что-то вроде этого:

User.find({ email: { $in: emails } }, function(err, results) { 
    if (err) return res.send(err); 
    res.send(results); 
}); 

Стоит также отметить, что Javascript однопоточен. Это означает, что много операций происходит асинхронно, то есть вам нужно дождаться завершения операции, прежде чем вы сможете двигаться дальше. Вышеупомянутый оператор ведения журнала консоли не дожидается завершения операции с базой данных. Вы должны дождаться выполнения функции обратного вызова.

UPDATE: Также заметили, что вы перебираете emails, но затем используете project.students[i] в каждой итерации. Я не могу видеть остальную часть вашего кода, но это просто глючный код. Вы должны либо зацикливаться на project.students, либо, используя emails[i] в каждой итерации.

ОБНОВЛЕНИЕ 2: Похоже, что вы хотите отправить больше, чем просто массив пользователя с ответом. Итак, первая цель - использовать один запрос с помощью оператора $in (см. Пример выше - вы должны иметь возможность передавать список писем в mongoose). Все, что связано с монго, вы всегда хотите уменьшить количество запросов к базе данных, если вы вообще не заботитесь об эффективности. Вторая задача - переформатировать ваших пользователей и другие данные соответственно:

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); 
}); 
+0

Ну, я также регистрирую его на front-end (AngularJS), и массив тоже пуст. Моя цель состоит в том, чтобы объединить объекты, чтобы я мог передать их как объект для моего ответа, так как я возвращаюсь гораздо больше, чем просто пользователи. – bobbybouwmann

+0

Я обновил свой ответ, чтобы показать пример отправки большего количества данных. –

+0

Aa У меня есть идея, позвольте мне попробовать: D – bobbybouwmann

Смежные вопросы