Почему я не могу использовать res.json () дважды в одном почтовом запросе?

У меня есть приложение для чат-бота, в которое я хочу отправить одно сообщение, например. res.json ("Привет") из экспресс, затем другое сообщение позже, например res.json («Как дела?»), но вы хотите обработать какой-то код между ними.

У моего кода, похоже, есть некоторые проблемы с этим, потому что, когда я удаляю первый res.json (), второй работает нормально и не вызывает никаких проблем.

Заглядывая в свои журналы heroku, я получаю от сервера множество глупых ответов с IncomingMessage = {}, содержащими объекты readableState и Server, когда я включаю обе эти функции res.json ().

Любая помощь приветствуется.

Покажи свой код. Если вам нужен чат-бот, вы должны использовать для разговора не экспресс, а веб-сокеты. Загляните в socket.io

Marcos Casagrande 03.06.2018 18:28

HTTP - это запрос / ответ. Клиент отправляет запрос, сервер отправляет ОДИН ответ. Ваш первый res.json() - это ваш ОДИН ответ. Вы не можете отправить другой ответ на тот же запрос.

jfriend00 03.06.2018 18:38

@Casagrande большое спасибо. Мне нужно отправить несколько ответов, например, мой бот читает сообщение и несколько сообщений. Если вы можете порекомендовать хорошие статьи по созданию чат-ботов, дайте мне знать :)

Jake Walker 03.06.2018 18:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 241
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

res.json () всегда немедленно отправляет ответ клиенту (повторный вызов вызовет ошибку). Если вам нужно постепенно наращивать отклик, вы можете постепенно украсить простой старый объект javascript; например, добавление элементов в массив. Когда вы закончите, вызовите res.json () с созданным ответом.

Но вы должны опубликовать свой код, чтобы мы могли видеть, что происходит.

спасибо, это полезно знать, поскольку вы, вероятно, можете сказать, что я новичок в js / node.js. Этот метод не сработает для меня, так как мне нужно отправить ответ, чтобы сказать, что я печатаю, пока мой веб-перехватчик просматривает базу данных и т. д. Я собираюсь проверить socket.io, как рекомендовано выше

Jake Walker 03.06.2018 18:56
Ответ принят как подходящий

HTTP - это запрос / ответ. Клиент отправляет запрос, сервер отправляет ОДИН ответ. Ваш первый res.json() - это ваш ОДИН ответ. Вы не можете отправить другой ответ на тот же запрос. Если нужно просто собрать все данные перед отправкой одного ответа, вы можете переосмыслить свой код, чтобы собрать все данные перед отправкой одного ответа.

Но то, что вы, кажется, ищете, - это «проталкивание сервера», когда сервер может отправлять данные клиенту постоянно, когда он этого хочет. Обычным решением для этого является подключение к webSocket (или socket.io, который построен поверх webSocket и добавляет больше функций).

В архитектуре webSocket / socket.io клиент устанавливает соединение с сервером, и соединение остается открытым на неопределенный срок. Тогда любая сторона соединения может отправлять сообщения на другой конец. Это наиболее полезно, когда сервер хочет «протолкнуть» данные клиенту в любое время. В этом случае клиент устанавливает соединение, а затем сервер может отправлять данные клиенту через это соединение в любое время. Клиент регистрирует прослушиватель входящих сообщений и будет уведомлен каждый раз, когда сервер отправляет ему какие-либо данные.

И webSocket, и socket.io полностью поддерживаются в современных браузерах и в node.js. Я бы лично рекомендовал использовать socket.io, потому что некоторые из добавляемых им функций (уровень обмена сообщениями, автоматическое переподключение и т. д.) Очень полезны.

Чтобы использовать такой постоянно подключенный сокет, вам необходимо убедиться, что инфраструктура вашего хостинга правильно настроена, чтобы это позволяло.

Другие вопросы по теме