#node.js #mongodb #express
#node.js #mongodb #экспресс
Вопрос:
Я новичок в express js и node js. Мне интересно, возможно ли это сделать или нет.
первое, что я пытаюсь подсчитать по 1 запросу.
2-й я запрашиваю вход в систему коллекции. выполните цикл, отформатируйте и получите значения имен, используя идентификаторы.
Я получаю undefined на count1 и вижу, что он пропущен в ответе json.
как мне передать результаты запроса за пределы запроса?
router.post('/logmein', function(req, res, next) {
var email = req.param('email');
var password = req.param('password');
var count1;
MongoClient.connect(MongoUrl, function(err, db) {
if (err) return;
db.collection('users').count({email: email,password: md5(password)}, function(err, count) {
count1 = count;
});
db.collection('login').find({email: email,password: md5(password)}).toArray(function(err, results){
console.log(results); // output all records
});
//use results
/*
foreach each results format with other info
var new_array;
*/
res.json({"success": true,"count":count1,new_array: new_array});
});
});
Комментарии:
1. какую ошибку вы получаете при попытке выполнить приведенный выше код? вы пробовали просто возвращать результаты вместо того, чтобы выводить их на консоль?
2. Я получаю неопределенное значение для переменной count1.
Ответ №1:
Проблемы с асинхронностью, вам нужно больше на это смотреть. Используйте асинхронный модуль, и тогда вы сможете запускать запросы параллельно. Наконец, вы получите результаты в последнем обратном вызове. Этот фрагмент решит вашу проблему:
var async = require('async');
router.post('/logmein', function (req, res, next) {
var email = req.param('email');
var password = req.param('password');
var retResults;
var count1;
MongoClient.connect(MongoUrl, function (err, db) {
if (err) return;
async.parallel([
function(callback){
db.collection('users').count({ email: email, password: md5(password) }, function (err, count) {
return callback(err, count);
});
},
function(callback){
db.collection('login').find({ email: email, password: md5(password) }).toArray(function (err, results) {
return callback(err, results);
});
}
], function(err, results) {
if (err) {
// @todo: handle the error
}
count1 = results[0];
retResults = results[1];
//use results
/*
foreach each results format with other info
var new_array;
*/
res.json({ "success": true, "count": count1, new_array: new_array });
};
});
});
Комментарии:
1. Я все еще получаю неопределенные значения для count1 и retResults.
2. также, когда я попытался поместить console.log (retResults); вызов не завершается.
3. @LJBoy Я забыл ввести обратные вызовы. Просто исправил это, попробуйте еще раз.
4. о, спасибо. Я также поместил res.json({ «success»: true, «count»: count1, new_array: new_array }); внутри последней функции. это не сработало снаружи.
5. @LJBoy да, просто заметил это и переместил. Если вы довольны, вы можете принять ответ 🙂
Ответ №2:
Вам нужно что-то вроде async.parallel для управления асинхронным потоком вашего приложения nodejs
async.parallel([
function(callback){ ... },
function(callback){ ... }
], function(err, results) {
// optional callback
};