gpt4 book ai didi

node.js - 与 api 一起使用的 Node js websockets

转载 作者:搜寻专家 更新时间:2023-11-01 00:05:21 24 4
gpt4 key购买 nike

我有一个用 express 构建的 Node 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);

最佳答案

您需要引入消息 ID。通过计算一个数字来生成它们。

将以下字典添加到您的代码中:

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):

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

帮助防止可能的溢出的消息 ID 生成的辅助函数:

const MaximumMessageId = 0xFFFFFFFFFFFF; // 48-bit integer (64-bit is too much for javascript, 32-bit is a little bit too stingy)

function obtainFreeMessageId() {
const messageId = nextMessageId;
nextMessageId++;
if(nextMessageId > MaximumMessageId) {
nextMessageId = 1;
}
return messageId;
}

如果您想确保请求结束,请考虑设置超时,在一定时间后调用响应回调。清除响应回调中的超时。

关于node.js - 与 api 一起使用的 Node js websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44871679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com