使用api的节点js websockets

我有一个节点js API与快速build立。 在我的一个http端点中,我想接受请求并通过websockets发送到另一个服务器,然后返回一个答复。 我正在使用ws库 。 问题是,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.postcallback),请执行以下操作:

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

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