0

我正在使用 node、express 和 mongoose 构建一个简单的测试应用程序。我的问题是了解我应该如何处理节点?下面的函数是通过来自客户端的标准 $.ajax 调用调用的,我不明白的一点是在第 111 行,我需要执行查找操作,但这是异步的,因此结果不可用,我们会接到一个电话当从 Mongo 准备好查找结果时返回第 112 行,但是在等待搜索结果时,我应该在这个函数的底部做什么,我应该使用下一个刻度函数吗?

我环顾四周,我确信答案已经存在,但我找不到它,而且我认为我对 node.js 的解释很差,所以请原谅我确定你知道我在问什么。

exports.loginAuthenticate = function(mongoose){
  96     return function(req, res){
  97         var error = { errorCode: 0, errorMessage:"No error" };
  98 
  99         if(req.body.Username==null || typeof req.body.Username=="undefined" || req.body.Username.length==0){
 100             error.errorCode=1;error.errorMessage="You MUST specify a username before attempting to login.";
 101         }
 102         if(req.body.Password==null || typeof req.body.Password=="undefined" || req.body.Password.length==0){
 103             error.errorCode=1;error.errorMessage="You MUST specify a password before attempting to login.";
 104         }
 105 
 106         if(error.errorCode!=0){ res.send(error); return; }
 107 
 108         mongoose.connect("mongodb://localhost/nm", function(err){
 109 
 110             var client = mongoose.model("Client");
 111             client.findOne({ Username: req.body.Username }, "Password", function(err, found){
 112                 if(err){
 113                     console.log("findOne -> Error!");
 114                     return;
 115                 }
 116 
 117                 if(found!=null){
 118                     if(req.body.Password!=found._doc.Password){
 119                         error.errorCode=1;
 120                         error.errorMessage="Sorry your username or password is invalid.";
 121                     }
 122                 }
 123                 else{
 124                     error.errorCode=1; // Did not find the user within the system
 125                 }
 126                 res.send(error);
 127                 return;
 128             });
 129 
 130         });
 131 
 132     return;
 133     };
 134 };
4

2 回答 2

1

您的代码存在一个问题:在第 112 行,如果发生错误,您只需console.log返回即可。那是不对的。

使用 Express,您始终必须通过发回响应来结束当前请求,即使发生错误也是如此。否则,请求将永远不会结束,并且看起来像是在停止。因此,在 Express 应用程序中处理错误的一种方法是返回 HTTP 500 响应:

if (err) {
  console.log("findOne -> Error!");
  return res.send(500, 'An error has occurred!');
}

否则,正如@JoshB 指出的那样,它应该可以工作。

于 2013-10-18T06:16:59.123 回答
0

您的代码应该按您的预期工作 - 您res.send()用来发回结果 - 错误、成功或任何您想要的。它也可以是异步的,因此代码中的res.send()嵌套findOne()将按照您期望的正确顺序响应。

在函数结束时,无需返回任何内容。

于 2013-10-18T02:25:07.030 回答