我有一个用express构建的节点js API。在我的一个http端点中,我想接受请求并通过websockets将其发送到另一台服务器,然后返回一个回复。我正在使用ws library。问题是websockets通信不是同步的,所以我不知道如何返回API客户端的答案。无论如何,这是我尝试过的,但它并不完整:
const express = require('express');
const app = express();
const WebSocket = require('ws');
const uuid = require('uuid');
const bodyParser = require('body-parser');
const ws = new WebSocket('ws://localhost:7465/');
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ extended: false }));
ws.on('open', function open() {
console.log('connected');
});
ws.on('close', function close() {
console.log('disconnected');
});
ws.on('message', function incoming(data) {
console.log('Got data from server:');
console.log(data);
});
app.post('/my-http-endpoint', function (req, res) {
var payload = JSON.stringify({ body: req.body, requestID: uuid.v4() });
ws.send(Buffer.from(payload));
// How to send a reply?
})
app.listen(1337);
答案 0 :(得分:0)
您需要引入消息ID。通过计算一个数字来生成它们。
将以下字典添加到您的代码中:
os.path.parentdir
当您发送内容时(在您的案例的let nextMessageId = 1;
const responseCallbacks = {};
回调中),请执行以下操作:
app.post
在消息上执行以下操作(响应必须包含const messageId = obtainFreeMessageId(); // see below
ws.send(Buffer.from({ messageId, payload }));
responseCallbacks[messageId] = function(data) {
// make use of the response message data here
};
):
messageId
生成消息ID的辅助函数有助于防止可能的溢出:
const messageId = message.messageId; // message has a message ID
const responseCallback = responseCallbacks[messageId];
if(responseCallback) {
responseCallback(message.data); // message contains your data
delete responseCallbacks[messageId];
}
如果要确保请求结束,请考虑设置一个超时,该超时会在一定时间后调用响应回调。清除响应回调中的超时。