📜  如何在 Node.jsExpress.js 中从服务器端本身连续调用 API?(1)

📅  最后修改于: 2023-12-03 15:38:22.060000             🧑  作者: Mango

在 Node.js 中使用 Express.js 可以非常方便地创建 API,并从客户端调用它们。但是,有时候需要在服务器端本身连续调用 API,以便在后台处理数据或在多个 API 之间共享信息。这就需要使用 Node.js 中的 HTTP 请求模块。

安装和导入模块

在 Node.js 中使用 HTTP 请求模块需要先安装:

npm install http

然后在 Node.js 代码中导入模块:

const http = require('http');

同时也要导入 Express.js:

const express = require('express');
const app = express();
发送 HTTP 请求

要发送 HTTP 请求,需要使用 http.request 函数。它接受一个选项对象,用于设置请求的参数,并返回一个 http.ClientRequest 对象,它实现了可写流,可以向服务器写入请求数据。

在这个例子中,我们将从服务器本身调用 /getTime API,它返回当前时间戳:

const options = {
    host: 'localhost',
    port: 3000,
    path: '/getTime',
    method: 'GET'
};

const req = http.request(options, res => {
    let responseBody = '';
    res.on('data', chunk => responseBody += chunk);
    res.on('end', () => {
        const time = JSON.parse(responseBody).time;
        console.log(`The current time is ${time}`);
    });
});

req.end();

这里我们设置了请求包含以下参数:

  • host: 被请求的主机名,本例中为 localhost
  • port: 被请求的端口号,本例中为 3000
  • path: 被请求的路径,本例中为 /getTime
  • method: 请求方法,本例中为 GET

我们首先创建一个 ClientRequest 对象 req,然后发起请求并向其写入数据,这里写入的是空数据,因为我们不需要在此处发送请求体。最后,我们等待服务器相应数据,将其拼接到字符串 responseBody 中,通过 JSON.parse 解析为 JSON 数据,并取时间属性。

将数据传回 Express.js 应用程序

在连续调用的情况下,我们可能需要将数据传回 Express.js 应用程序中的下一个处理程序。为此,我们可以使用 Node.js 中的 eventEmitter 模块来创建一个事件,并为其添加侦听器。在上面的例子中,我们可以编写以下代码:

const EventEmitter = require('events');

const eventEmitter = new EventEmitter();

eventEmitter.on('timeFetched', time => {
    console.log(`The current time is ${time}`);
});

const req = http.request(options, res => {
    let responseBody = '';
    res.on('data', chunk => responseBody += chunk);
    res.on('end', () => {
        const time = JSON.parse(responseBody).time;
        eventEmitter.emit('timeFetched', time);
    });
});

req.end();

在这里,我们创建了一个 timeFetched 事件,并为其添加一个侦听器来处理时间数据。在 req 对象中,我们等待响应数据,取得时间并从 eventEmitter 对象中触发 timeFetched 事件,并将时间作为参数传递给事件侦听器。

这样就可以在连续的 API 调用中传递数据和事件了。

结论

以上代码展示了如何在 Node.js Express.js 应用程序中从服务器本身连续调用 API。我们使用了 HTTP 请求模块和 eventEmitter 模块来实现此功能。通过这种方法,我们可以在服务器端本身更好地处理数据和共享信息。