关于节点和nob阻塞IO的知识非常有限,请原谅我,如果我的问题太天真了。
为了在响应主体中返回所需信息,我需要
我的问题是......我怎么能等待回复?或者只有当我收到来自API的响应时才能将信息发送到客户端(据我所知,在这种情况下连接应该是双向的,这意味着我将无法使用HTTP这样做)。
还有一个问题。如果一个请求等待来自API的响应,这是否意味着其他用户也将被迫等待(因为节点是单线程的),直到我将线程/进程的数量从1增加到N?
答案 0 :(得分:9)
您将回调传递给调用该服务的函数。如果服务是数据库,例如:
db.connect(host, callback);
代码中的其他地方:
var callback = function(err, dbObject) {
// The connection was made, it's safe to handle the code here
console.log(dbObject.status);
res.json(jsonObject, 200)
};
或者你可以使用匿名函数,所以:
db.connect(host, function(err, dbObject) {
// The connection was made, it's safe to handle the code here
console.log(dbObject.status);
res.json(jsonObject, 200)
});
在调用和回调之间,节点自由处理其他客户端/连接,“非阻塞”。
答案 1 :(得分:6)
这种情况正是节点设计要解决的问题。一旦收到客户端的请求,您就可以发出一个http请求,该请求应该带有一个回调参数。这将在请求完成时调用您的回调函数,但是在您等待响应时,节点可以执行其他工作(包括服务其他客户端)。请求完成后,您可以让代码将响应返回给仍在等待的客户端。
节点进程使用的内存和CPU数量将随着其他客户端连接而增加,但只需要一个进程来处理多个并发客户端。
Node专注于异步执行慢速I / O,以便应用程序代码可以启动任务,然后在I / O完成后再次开始执行代码。
答案 2 :(得分:4)
一个典型的例子可能会说清楚。我们调用FB API。当我们得到响应时,我们会修改它,然后将JSON发送给用户。
var express = require('express');
var fb = require('facebook-js');
app.get('/user', function(req, res){
fb.apiCall('GET', '/me/', {access_token: access_token}, function(error, response, body){ // access FB API
// when FB responds this part of the code will execute
if (error){
throw new Error('Error getting user information');
}
body.platform = 'Facebook' // modify the Facebook response, available as JSON in body
res.json(body); // send the response to client
});
});