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

时间:2018-06-03 16:27:04

标签: node.js express node-modules

我有一个聊天机器人应用程序,我想发送一条消息,例如来自express的res.json(" Hello"),然后是另一个消息,例如res.json("你好吗"),但想要在两者之间处理一些代码。

我的代码似乎有一些问题,因为当我删除第一个res.json()然后第二个工作正常,并没有导致任何问题。

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

HTTP是请求/响应。客户端发送请求,服务器发送ONE响应。您的第一个res.json()是您的回复。您无法向同一请求发送另一个响应。如果只是在发送一个响应之前收集所有数据,您可以重新考虑您的代码以收集所有数据,然后再发送一个响应。

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

在webSocket / socket.io体系结构中,客户端与服务器建立连接,连接将无限期保持打开状态。然后,连接的任何一方都可以向另一端发送消息。当服务器想要"推送"随时向客户提供数据。在这种情况下,客户端建立连接,然后服务器可以随时通过该连接向客户端发送数据。客户端为传入消息注册一个监听器,并在服务器向其发送一些数据时随时通知。

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

要使用这样的连续连接套接字,您必须确保正确配置托管基础架构以允许它。