我是 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 方法更好的方法吗?
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());
我理解您的目标是使用 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 应用程序中实现实时通信的强大工具,我鼓励您进一步探索它们的功能。