节点asynchronous调用返回数据作为响应
我是nodejs的新手,所以我有一个基本的问题,这是我的scanrio
- 我有一个JavaScript客户端正在向节点服务器发出一个http请求,以从数据库读取值。
-
一旦节点服务器接收到请求,它会进行一个简单的数据库调用,并在响应中将数据返回给客户端,这就是问题所在。
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/