运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现

Posted

技术标签:

【中文标题】运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现【英文标题】:How handle Node.js when performing ajax calls when running Mongoose finds 【发布时间】:2013-10-26 12:52:51 【问题描述】:

我正在使用 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 ;

【问题讨论】:

【参考方案1】:

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

在函数结束时,不需要返回任何东西。

【讨论】:

Chers Josh 信息非常好,感谢您抽出宝贵的时间,我真的很感激。谢谢!【参考方案2】:

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

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

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

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

【讨论】:

感谢在我试图了解节点的执行周期时任何有建设性的事情都很棒,再次感谢!

以上是关于运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现的主要内容,如果未能解决你的问题,请参考以下文章

离开页面时如何处理jQuery ajax发布错误

离开页面时如何处理jQuery ajax发布错误

发生管道损坏时如何处理 AJAX 响应?

ASP.NET MVC Ajax 错误处理

应用未运行时如何处理远程通知

从套接字读取时如何处理阻塞的 read() 调用?