node.js等待响应

时间:2013-01-16 14:30:41

标签: node.js

关于节点和nob阻塞IO的知识非常有限,请原谅我,如果我的问题太天真了。

为了在响应主体中返回所需信息,我需要

  • 拨打第三方API
  • 等待回复
  • 使用我从API获得的信息添加一些修改并返回JSON响应。

我的问题是......我怎么能等待回复?或者只有当我收到来自API的响应时才能将信息发送到客户端(据我所知,在这种情况下连接应该是双向的,这意味着我将无法使用HTTP这样做)。

还有一个问题。如果一个请求等待来自API的响应,这是否意味着其他用户也将被迫等待(因为节点是单线程的),直到我将线程/进程的数量从1增加到N?

3 个答案:

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