【问题标题】:Why can't I use res.json() twice in one post request?为什么我不能在一个 post 请求中使用 res.json() 两次?
【发布时间】:2018-06-04 03:51:47
【问题描述】:

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

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

查看我的 heroku 日志,当我包含这两个 res.json() 函数时,我从服务器收到了很多糟糕的 gook 响应,其中 IncomingMessage = {} 包含 readableState 和 Server 对象。

任何帮助将不胜感激。

【问题讨论】:

  • 显示您的代码。如果你想要一个聊天机器人,你不应该使用 express 进行对话,而应该使用 websockets。查看socket.io
  • HTTP 是请求/响应。客户端发送请求,服务器发送一个响应。您的第一个 res.json() 是您的 ONE 回复。您不能对同一请求发送另一个响应。
  • @Casagrande 非常感谢。我需要发送多个响应,例如我的机器人正在阅读消息和多条消息。如果您可以推荐任何构建聊天机器人的好文章,请告诉我:)

标签: node.js express node-modules


【解决方案1】:

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

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

在 webSocket/socket.io 架构中,客户端与服务器建立连接,并且连接无限期地保持打开状态。然后连接的任何一方都可以向另一端发送消息。当服务器想要随时将数据“推送”到客户端时,这是最有用的。在这种情况下,客户端建立连接,然后服务器可以随时通过该连接向客户端发送数据。客户端为传入的消息注册一个侦听器,并在服务器向其发送一些数据时收到通知。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的了解,因为您可能知道我是 js / node.js 的新手。该方法对我不起作用,因为我需要发送回复说我正在打字,而我的 webhook 在数据库中查找等。我将按照上面的建议检查 socket.io
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 2013-08-03
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多