Express Node js Webssockets正在接收来自Websocket服务器的消息,但无法发送它们 [英] Express node js webssockets is recieving messages from websocket server but not being able to send them

查看:91
本文介绍了Express Node js Webssockets正在接收来自Websocket服务器的消息,但无法发送它们的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用aws api网关设置了websockets,也有一个使用node,express和ws websockets运行的ec2实例,我能够将带有wscat的消息发送到apigateway wss url,它显示在ec2实例中,但是,如果我从ec2实例发送消息,它不会再次出现在wscat中.我遵循此教程来设置apigateway https://aws.amazon.com/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/

I have websockets setup with aws api gateway, I also have an ec2 instance running with node and express and ws websockets, I am able to send a message with wscat to the apigateway wss url and it shows up in the ec2 instance, but if I send a message from the ec2 instance it doesnt show up back in the wscat. I followed this tut to setup the apigateway https://aws.amazon.com/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/

这是ec2实例代码.我不太确定这可能是什么问题

Here is the ec2 instance code. I am not quite sure what might be wrong with it

const express = require("express");
const app = express();
const port = 8080;
const WebSocket = require("ws");
const url = "wss://obsf.execute-api.us-east-1.amazonaws.com/Prod";
const ws = new WebSocket(url);

process.setMaxListeners(0) // I have tried with and without this line

app.get("/", (req, res) => {
  var test = { action: "sendmessage", data: "hello world" };

  ws.on("open", function open() {
    ws.send(JSON.stringify(test));
  });

  ws.on("message", function incoming(data) {
    console.log(data);
  });

  ws.on('error', (error) => {
    console.log(error)
  });

  res.send("Hello World!");
});

app.post("/doorbell", (req, res) => {
  console.log(req);
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

更新:

我实际上遇到以下错误

0|express  |     at Module.load (node:internal/modules/cjs/loader:948:32)
0|express  |     at Function.Module._load (node:internal/modules/cjs/loader:789:14)
0|express  |     at Object.<anonymous> (/home/ubuntu/.nvm/versions/node/v15.1.0/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23)
0|express  |     at Module._compile (node:internal/modules/cjs/loader:1083:30)
0|express  |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1112:10)
0|express  |     at Module.load (node:internal/modules/cjs/loader:948:32)
0|express  |     at Function.Module._load (node:internal/modules/cjs/loader:789:14)
0|express  | (node:13300) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 open listeners added to [WebSocket]. Use emitter.setMaxListeners() to increase limit
0|express  | (Use `node --trace-warnings ...` to show where the warning was created)
0|express  | (node:13300) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message listeners added to [WebSocket]. Use emitter.setMaxListeners() to increase limit
0|express  | (node:13300) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [WebSocket]. Use emitter.setMaxListeners() to increase limit
0|express  | (node:13392) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 open listeners added to [WebSocket]. Use emitter.setMaxListeners() to increase limit
0|express  | (Use `node --trace-warnings ...` to show where the warning was created)
0|express  | (node:13392) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message listeners added to [WebSocket]. Use emitter.setMaxListeners() to increase limit
0|express  | (node:13392) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [WebSocket]. Use emitter.setMaxListeners() to increase limit

更新我也尝试添加以下内容

Update I ahve also tried adding the following

var EventEmitter = require('events');


const ee = new EventEmitter()
ee.setMaxListeners(0);

并仍然收到eventEmitter错误

and still getting the eventEmitter error

更新:

因此,如果我从app.get中取出ws.on("open")...,它确实有效,我实际上想放入该帖子中,因为我在帖子中遇到相同的错误.我想我会测试一下,但是为什么我不能把它放在apt.get

So it works if I tak the ws.on("open")... out of the app.get, I actually want to put in in the post will I get the same error in the post. I guess I wll test that, but what gives why cant I put it in the apt.get

更新:我尝试放入发布请求,但仍然收到事件发射器错误.

Update: I tried putting in in the post request but I still get the event emitter error.

推荐答案

我从ws github问题中提出了疑问,所以我将其发布给其他人

I got an aswer from the ws github issues, so I am posting it for anyone else

app.post('/doorbell', (req, res) => {
  var hmm1 = { action: 'sendmessage', data: 'hello world from post request' };

  if (ws.readyState === WebSocket.OPEN) {
    ws.send(JSON.stringify(hmm1));
    res.send('heya hey');
  } else {
    res.send('The WebSocket connection is not open');
  }
});

这篇关于Express Node js Webssockets正在接收来自Websocket服务器的消息,但无法发送它们的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆