Node.js 在mongoose查询返回集合之前,应用程序应该如何处理http get响应?

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

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);
            } 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
将作为类型返回。