如何处理客户端nodejs的asynchronous请求?

我是NodeJS的新手。 我在服务器端使用NodeJS。 我试图做一个简单的基于REST的GET请求,它从用户接收search参数searchvar ,并返回在JSON数组中find的匹配logging。 我的服务器代码如下:

 var express = require('express'); var app = express(); var MongoClient = require('mongodb').MongoClient; var assert = require('assert'); var ObjectId = require('mongodb').ObjectID; var url = 'mongodb://localhost:27017/mydb'; app.get('/search', function(req, res) { res.set({ 'content-type': 'application/json; charset=utf-8' }); res.header("Content-Type", "application/json; charset=utf-8"); res.charset = 'utf-8'; var searchvar = req.query.searchvar; if(searchvar != null) { var recordsArray = new Array(); console.log("searchvar :: " + searchvar ); MongoClient.connect(url, function(err, db) { var cursor = db.collection('myCollections').find({"name": new RegExp(searchvar)}); cursor.each(function(err, doc) { //assert.equal(err, null); if (doc != null) { var tempObject = {"name": doc.name, "cat": doc.cat}; recordsArray.push(tempObject); console.dir(doc); } else { db.close(); } }); if(recordsArray.length > 0) { console.log("if........"); res.json({"status": "SUCCESS", "message": "The request processed successfully.", "records":recordsArray}); } else { console.log("else........"); res.json({"status": "FAILURE", "message": "No records found corresponding to given search query."}); } }); } else { res.json({"status": "FAILURE", "message": "The searchvar is missing."}); } //res.send('id: ' + req.query.id); }); app.listen(3000); 

当我用以下URL在浏览器中用RESTClient调用它时:

 http://localhost:3000/search?searchvar=aa 

我得到以下回应:

{“status”:“FAILURE”,“message”:“找不到对应于给定search查询的logging”。}

这是一个asynchronous调用。 我想知道服务器使用哪个进程,当处理完成时可以返回响应,并在客户端处理这个asynchronous响应。 提前致谢。

出现这种响应是因为if检查:

 if(recordsArray.length > 0) { console.log("if........"); 

在传递给cursor.each方法的callback已经完成其处理之前被执行。 结果,数组是空的。

build议的解决scheme
cursor.forEach方法使用一个asynchronous执行的callback函数。 这意味着您只能在callback本身内访问callback的执行结果(除了返回一个Promise对象外)。 解决方法是:

 cursor.forEach(function(doc) { if (doc != null) { var tempObject = {"name": doc.name, "cat": doc.cat}; recordsArray.push(tempObject); console.dir(doc); } }, function(err) { if(recordsArray.length > 0) { console.log("if........"); res.json({"status": "SUCCESS", "message": "The request processed successfully.", "records":recordsArray}); } else { console.log("else........"); res.json({"status": "FAILURE", "message": "No records found corresponding to given search query."}); } db.close(); }); 

我想你错过了MongoClient Collection find()方法的callback参数。 您应该将处理逻辑移到callback中。

请参阅MongoDB文档中的这些示例 。

你的代码看起来像这样:

 db.collection('myCollections').find({"name": new RegExp(searchvar)}).toArray(function(err, docs) { // iterate through docs; perform your logic db.close(); res.json({...}); }); 

我认为你最好的select是通过一个Nodejs / MongoDB 教程来了解一切是如何工作的。 从快速查看代码,您的响应不是asynchronous的。 任何时候服务器的响应都不是asynchronous的。 asynchronous是在服务器端实现类似Websockets或HTTPcallback的时候实现的。

我同意吉姆说,这个问题可能是在你的客户端(如果你仍然有问题,请张贴代码)。 一般来说,JS客户端通过使用callback或承诺来实现asynchronous,而asynchronous客户端则不需要asynchronous服务器。 进行asynchronous客户端调用很常见的原因是,您在等待服务器响应时不locking您的GUI。