节点异步调用返回响应数据

时间:2016-07-01 05:03:45

标签: node.js asynchronous

我是nodejs的新手,所以我有一个基本的问题,这是我的扫描

  1. 我有一个javascript客户端,它向节点服务器发出http请求以从数据库中读取值。
  2. 一旦节点服务器收到请求,它就会进行简单的数据库调用并将数据返回给响应中的客户端,这就是问题所在。

    router.get('/state', function(req, res){        
       var result = dbServer.makeDBCall();//Before this line executes and returns the result the next line executes
       res.send(result); 
    }
    
  3. 来自节点服务器的数据库调用是异步的,因此在返回结果之前,节点服务器已经向客户端发送了空白响应。实现这一目标的标准/可接受方式是什么,我知道我可以使用异步来阻止节点线程,但是节点的整个目的是否正确?

3 个答案:

答案 0 :(得分:3)

这取决于您使用的数据库节点模块类型。

除了标准回调方法,还有承诺方式。 pg-promise库是其中之一。

参见示例代码:

this.databaseConnection.makeDBCall('your query...')
    .then(function(dbResponse) {
        // Parse the response to the format you want then...
        res.send(result);    
    })
    .catch(function(error) {
        // Handle error
        res.send(error.message);
    });

@spdev:我看到你的一条评论,你担心Node实际上知道谁回复响应,尤其是当有多个请求时。

这是一个非常好的问题,老实说 - 我也不太了解它。

简而言之,答案是 节点以某种方式通过在HTTP请求通过时创建相应的ServerResponse对象来处理此问题。这个对象似乎有一些聪明才能告诉Nodejs网络堆栈如何在将其作为数据包解析时将自身路由回调用者。

我尝试使用谷歌搜索得到一个答案,但没有太远。我希望ServerResponseObject文档可以为您提供更多的见解。如果你得到答案,请与我分享!

https://nodejs.org/api/all.html#http_class_http_serverresponse

答案 1 :(得分:0)

尝试以下代码。

router.get('/state', function(req, res){        
   var result = dbServer.makeDBCall(function(err,result){
    if(!err) {
      res.send(result); 
     }
  });
}

希望得到这个帮助。

答案 2 :(得分:0)

dbServer.makeDBCall();必须有一个在语句完成执行时运行的回调。 像 -

这样的东西
dbServer.makeDBCall({query: 'args'}, function(err, result){
    if (err) // handle error
    res.send(result); 
})

您从该回调函数返回db的响应。

从此处了解有关回调的详情 -

nodeJs callbacks simple example

https://docs.nodejitsu.com/articles/getting-started/control-flow/what-are-callbacks/