节点js与api一起使用的websockets

时间:2017-07-02 14:10:14

标签: node.js websocket

我有一个用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);

1 个答案:

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

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