如何从服务器向客户端发送函数

问题描述 投票:0回答:2

我是 NodeJS 和 ExpressJS 中发布请求的新手,我试图传递一个函数(不是函数的结果)以在客户端中调用,我有这个监听器和这个发布请求(我正在尝试制作一个不和谐的机器人 webview 工具)

服务器端

app.post("/dashboardstartup", jsonParser, (req, res) => {
    // authClient is a discord client (Discord Bot)

    if(authClient)
    {
        authClient.on("messageCreate", (message) => {
             // always send the message once its created
             res.json({
                 message
             })
             // the problem is that when I send the result the fetch request from the client stops
        });
    }
})

客户端

// ...

await fetch("http://localhost:8080/dashboardstartup", {
     method: "POST";
     headers: {
         'Content-type': 'application/json'
     }

}).then(a=>a.json()).then(a=>{
   // once the fetch response is received, the fetch stops and the client can't listen to messages anymore

  console.log(a.messsage) // prints out "Hello world!"
})

还有比 fetch 方法更好的方法吗?

node.js express server-side client-side
2个回答
0
投票

您可以使用原生的

response.write()
方法。

response.json()
方法来自Express.js包,它在发送响应后在内部关闭连接。

以下是如何使用

.write()
的示例:

authClient.on("messageCreate", (message) => {
             // always send the message once its created
             res.write(JSON.stringify({ message }), 'utf8');
        });

它不会关闭连接,直到您手动关闭连接,并且客户端将继续侦听消息。所以记得当

authClient
结束时也结束回复:

authClient.on('close', () => res.end());

0
投票

我理解您的目标是使用 Node.js 和 ExpressJS 在 Discord 机器人和客户端之间创建实时通信通道。当您尝试使用 POST 请求将更新从服务器发送到客户端时,请务必注意,HTTP POST 由于其一次性请求-响应性质而不适合实时通信。

为了实现实时更新,我建议使用WebSocket,因为它们提供全双工通信,使得服务器和客户端之间建立持续的连接成为可能。

以下是如何实现这一点的概述: 在服务器端(使用ws库进行WebSocket通信):

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

// Simulating message creation in your Discord bot
function simulateMessageCreation() {
 return "Hello world!";
}

wss.on('connection', (ws) => {
// Send a message to the client whenever a message is created
 authClient.on("messageCreate", (message) => {
   const messageContent = simulateMessageCreation();
   ws.send(JSON.stringify({ message: messageContent }));
 });
});

在客户端(在浏览器中使用WebSocket API):

const ws = new WebSocket("ws://localhost:8080");

ws.onmessage = (event) => {
 const data = JSON.parse(event.data);
 console.log(data.message); // prints out "Hello world!" when a new 
message is created
};

通过使用WebSockets,您可以在服务器和客户端之间建立持久连接,从而实现实时更新。这样,您的客户端应用程序将能够连续侦听消息,而无需重复的 HTTP 请求。

请记住在运行服务器之前使用 npm 安装所需的依赖项,例如 ws 库。

WebSockets 是一个在 Web 应用程序中实现实时通信的强大工具,我鼓励您进一步探索它们的功能。

© www.soinside.com 2019 - 2024. All rights reserved.