2016-03-10 67 views
1

我是NodeJS的新手。我在服务器端使用NodeJS。我试图做一个简单的基于REST的GET请求,它从用户处获取搜索参数searchvar,并返回在JSON数组中找到的匹配记录。我的服务器代码如下:如何在客户端nodejs处理异步请求?

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

我得到如下回应:

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

当我与下列网址中的RESTClient实现调用它在浏览器中

{ “地位”: “FAILURE”,“message”:“找不到与给定搜索查询对应的记录”。}

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

+1

任何调用服务器,你认为是一个异步过程将严格在客户端处理。在客户端,您正在向服务器发起AJAX调用,然后将控制权交还给调用它的脚本,并返回一个包含AJAX请求状态的对象。创建AJAX请求的代码负责定期检查AJAX对象是否已收到响应,然后它必须对其执行操作。幸运的是,有许多抽象通过承诺和/或回调的形式使这更容易。浏览器或节点客户端也是如此。 –

回答

0

我认为你最好的选择是通过一个Nodejs/MongoDB tutorial了解一切是如何工作的。从快速查看代码,您的响应不是异步的。任何时候,服务器的响应都不是异步的。在实现类似Websockets或HTTP回调的服务器端时,可以实现异步。

我同意Jim的观点,问题可能在您的客户端(如果您仍然有问题,请发布代码)。通常,JS客户端通过使用回调或承诺来实现异步,但异步客户端不需要异步服务器。进行异步客户端调用很常见的原因是,您在等待服务器响应时不会锁定您的GUI。

1

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

在MongoDB文档中查看这些examples

您的代码将是这个样子:发生

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

的响应,因为if检查:

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

执行之前传递到cursor.each方法回调已经完成了它的处理。结果,数组是空的。

提出的解决方案
cursor.forEach方法采用异步执行的回调函数。这意味着您只能在回调本身内访问回调的执行结果(除非您返回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(); 
}); 
+1

'cursor.each'方法已被弃用,它也不会做你所声称的。正确的方法是['cursor.forEach'](http://mongodb.github.io/node-mongodb-native/2.1/api/Cursor.html#forEach),它有一个“迭代器”和一个回调函数以指示何时迭代实际完成。 OP的列表和你的代码实际上在迭代器内“工作”。在你的情况下,都试图发送一个响应“并”在每次迭代中挂起数据库连接。这会失败。 –

+1

非常感谢您指出这一点。我已经解决了这个问题。 – gnerkus