Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从路由请求发送ws消息_Javascript_Node.js_Express_Websocket - Fatal编程技术网

Javascript 如何从路由请求发送ws消息

Javascript 如何从路由请求发送ws消息,javascript,node.js,express,websocket,Javascript,Node.js,Express,Websocket,我一直在尝试创建一个应用程序,使用电报机器人,快速服务器和反应应用程序。因此,我需要创建一个从telegram bot到express的POST请求,而express将POST数据发送到websocket连接: const express = require("express"); const app = express(); const expressWs = require("express-ws")(app); // handles bot request app.post("/requ

我一直在尝试创建一个应用程序,使用电报机器人,快速服务器和反应应用程序。因此,我需要创建一个从telegram bot到express的POST请求,而express将POST数据发送到websocket连接:

const express = require("express");
const app = express();
const expressWs = require("express-ws")(app);

// handles bot request
app.post("/request", (req, res) => {
  playlist.push(req.body.url);
  res.status(200).send({ message: "video is added to playlist" });
});

// after handling requst data must go here and send ws message to client side
app.ws("/echo", (ws, req) => {
  ws.on("message", msg => {
  ws.send(`msg is = ${msg}`);
  });
});

我做得对吗?如果是的话,在app.post route处理请求后如何调用ws.send from?

根据我对您的问题的理解,以下是您的代码的更新版本,完全符合您的要求

我用
ws
替换了
expressws
包,因为这对于您的用例来说已经足够了

express服务器在端口8080上运行,而websocket服务器在端口8081上运行,因为它们是不同的协议,不会在同一端口上运行(您可以让它工作,但我不推荐它)


使用
curl-d'url通过curl进行测试=https://example.com/examplesong'localhost:8080/request
我有一个客户端连接到了
ws://localhost:8081
,一切看起来都很好。

可能有多个客户端连接到
/echo
端点,这与
/request
端点无关。如果什么您试图做的是将post请求的内容广播到连接的客户端,然后您必须监视到post端点的请求,并将该请求发送到这些客户端。您可以改用ws-package。
const express = require("express");
const Websocket = require('ws');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

const wss = new Websocket.Server({ port: 8081 });

wss.on('connection', (ws) => {
  console.log('One client connected');
  ws.on("message", msg => {
    ws.send(`msg is = ${msg}`);
  });
})

// handles bot request
app.post("/request", (req, res) => {
  // Broadcast URL to connected ws clients
  wss.clients.forEach((client) => {
    // Check that connect are open and still alive to avoid socket error
    if (client.readyState === Websocket.OPEN) {
      client.send(url);
    }
  });

  res.status(200).send({ message: "video is added to playlist" });
});


app.listen(8080, () => {
  console.log('Express listening on 8080');
  console.log('Websocket on 8081');
});