8

我对节点和 nob 阻塞 IO 的了解非常有限,所以如果我的问题太天真,请原谅我。

为了在响应正文中返回所需的信息,我需要

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

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

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

4

3 回答 3

10

您将回调传递给调用服务的函数。如果服务是数据库,例如:

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

在调用和回调之间,节点自由地处理其他客户端/连接,“非阻塞”。

于 2013-01-16T14:40:29.933 回答
6

这种情况正是节点旨在解决的问题。收到客户端的请求后,您可以发出 http 请求,该请求应带有回调参数。这将在请求完成时调用您的回调函数,但节点可以在您等待响应时执行其他工作(包括为其他客户端提供服务)。请求完成后,您可以让代码将响应返回给仍在等待的客户端。

节点进程使用的内存和 CPU 量将随着更多客户端连接到它而增加,但只需要一个进程来处理许多同时的客户端。

Node 专注于异步执行慢速 I/O,以便应用程序代码可以启动一个任务,然后在 I/O 完成后让代码再次开始执行。

于 2013-01-16T14:38:58.223 回答
5

一个典型的例子可能会很清楚。我们调用 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
    });
});
于 2013-01-16T16:36:01.087 回答