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

Posted

技术标签:

【中文标题】节点异步调用返回数据作为响应【英文标题】:node async call return data in response 【发布时间】:2016-11-03 09:25:33 【问题描述】:

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

    我有一个 javascript 客户端,它正在向节点服务器发出 http 请求以从数据库中读取值。

    一旦节点服务器收到请求,它会进行简单的 db 调用并在响应中将数据返回给客户端,这就是问题所在。

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

来自节点服务器的数据库调用是异步的,因此在返回结果之前,节点服务器已经向客户端发送了一个空白响应。实现这一目标的标准/可接受的方式是什么,我知道我可以使用异步阻塞节点线程,但是节点的整个目的就没有了?

【问题讨论】:

【参考方案1】:

试试下面的代码。

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

希望得到帮助。

【讨论】:

【参考方案2】:

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/

【讨论】:

谢谢,但是 node 怎么知道 res 应该去哪个客户端呢?节点会跟踪它吗?我的意思是如果多个客户打来了多个电话,它怎么知道?【参考方案3】:

这取决于您使用的是哪种数据库节点模块。

除了标准的回调方式,还有promise方式。 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 :我看到你的 1 个 cmets 担心 Node 是如何真正知道要回复谁的响应,尤其是当有多个请求时。

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

简而言之,答案是是的Node 通过在 HTTP 请求通过时创建相应的 ServerResponse 对象以某种方式处理这个问题。这个对象似乎很聪明地告诉 Nodejs 网络堆栈在它被解析为数据包时如何将自己路由回调用者。

我尝试在谷歌上搜索一下以寻找答案,但并没有走得太远。我希望 ServerResponseObject 文档可以为您提供更多的见解。如果你有答案,请与我分享谢谢!

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

【讨论】:

以上是关于节点异步调用返回数据作为响应的主要内容,如果未能解决你的问题,请参考以下文章

WCF服务需要调用异步

如何从异步调用返回响应

如何从异步调用返回响应

如何从异步调用返回响应

如何从异步调用返回响应

如何从异步调用返回响应