📅  最后修改于: 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.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 应用程序中的下一个处理程序。为此,我们可以使用 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 模块来实现此功能。通过这种方法,我们可以在服务器端本身更好地处理数据和共享信息。