【问题标题】:node js websockets used with api与 api 一起使用的节点 js websockets
【发布时间】:2017-07-10 05:59:16
【问题描述】:

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

【问题讨论】:

    标签: node.js websocket


    【解决方案1】:

    您需要引入消息 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多