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

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

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

来自节点服务器的数据库调用是asynchronous的,因此在返回结果之前,节点服务器已经向客户端发送了一个空的响应。 什么是达到这个标准/可接受的方式,我知道我可以使用asynchronous阻塞节点线程,但是那么节点的全部目的是正确的?

这取决于你正在使用什么样的数据库节点模块。

除了标准的callback方法,还有承诺的方式。 pg-promise库是那种types之一。

请参阅示例代码:

 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究竟是如何知道应该回复谁的,特别是当有多个请求的时候。

这是一个很好的问题,对你说实话,我也不太了解。

简而言之,答案是肯定的Node通过创build一个相应的ServerResponse对象来处理HTTP请求。 这个对象似乎有点聪明,可以告诉Nodejsnetworking堆栈,当它被parsing为数据包时,如何将自己路由callback用者。

我尝试了谷歌search一些答案,但没有太多。 我希望ServerResponseObject文档可以为您提供更多的见解。 与我分享,如果你有一个答案,谢谢!

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

尝试下面的代码。

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

希望这个帮助。

dbServer.makeDBCall(); 语句完成执行时必须有一个callback。 就像是 –

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

您从该callback函数返回数据库的响应。

了解更多关于从这里callback –

nodeJscallback简单的例子

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