为什么我不能在一个 post 请求中使用两次 res.json() ?

Why can't I use res.json() twice in one post request?

我有一个聊天机器人应用程序,我想在其中发送一条消息,例如res.json("Hello") 来自快递,然后是另一条消息,例如res.json("How are you doing"),但想处理两者之间的一些代码。

我的代码似乎有一些问题,因为当我删除第一个 res.json() 时,第二个可以正常工作并且不会引起任何问题。

查看我的 heroku 日志,当我包含这两个 res.json() 函数时,我从服务器收到大量 gobbledy gook 响应,带有 IncomingMessage = {},包含 readableState 和 Server 对象。

如有任何帮助,我们将不胜感激。

res.json() 总是立即向客户端发送响应(再次调用它会导致错误)。如果你需要逐渐建立一个响应,那么你可以逐步装饰一个普通的旧 javascript 对象;例如,将项目附加到数组。完成后使用构建的响应调用 res.json()。

但是你应该post你的代码,这样我们才能看到发生了什么。

HTTP 是 request/response。客户端发送一个请求,服务器发送一个响应。你的第一个 res.json() 是你的一个回应。您不能对同一个请求发送另一个响应。如果只是在发送一个响应之前收集所有数据的问题,您可以重新考虑您的代码以在发送一个响应之前收集所有数据。

但是,您似乎在寻找 "server push" 服务器可以随时向客户端连续发送数据的地方。通常的解决方案是 webSocket 连接(或 socket.io,它建立在 webSocket 之上并添加了更多功能)。

在webSocket/socket.io 架构中,客户端与服务器建立连接并无限期保持连接。然后连接的任何一端都可以向另一端发送消息。这在服务器想随时 "push" 数据给客户端时最有用。在这种情况下,客户端建立连接,然后服务器可以随时通过该连接向客户端发送数据。客户端注册传入消息的侦听器,并在服务器向其发送一些数据时随时收到通知。

现代浏览器和 node.js 完全支持 webSocket 和 socket.io。我个人建议使用 socket.io,因为它添加的某些功能(消息传递层、自动重新连接等...)非常有用。

要像这样使用持续连接的套接字,您必须确保您的托管基础​​设施已正确配置以允许它。