Экспресс ответная информация для обработки другой функцией - PullRequest
0 голосов
/ 28 августа 2018

У меня есть этот код:

 app.post('/pst', function(req, res) {
            var data = req.body.convo;

            res.render('waiting.ejs');  //ADDED THIS

            myFunc(data).then(result => {


            res.render('success.ejs');  //THEN THIS

            //---------------------------------
            //clever way to send text file to client from the memory of the server
            var fileContents = Buffer.from(result, 'ascii');
            var readStream = new stream.PassThrough();
            readStream.end(fileContents);
            res.set('Content-disposition', 'attachment; filename=' + fileName);
            res.set('Content-Type', 'text/plain');
            readStream.pipe(res);
            //--------------------------------------

            }).catch( .....

Что я хочу сделать, это когда есть POST, 1. захватить информацию 2. сделать res.render () 3. запустить функцию с почтовой информацией в качестве параметров 4. Сделайте этот фрагмент кода, который позволит клиенту загружать данные из памяти в виде TXT-файла. 5. сделать еще один res.render ()

Все работает, если исключить два res.render (). После того, как я это сделаю, я не могу установить заголовки. Я получаю эту ошибку.

Error: Can't set headers after they are sent.

Так что я подумал о возможном решении.

Возможно ли, что app.post () получит данные поста и выполнит res.render ().

Затем верните данные публикации, чтобы другая часть кода обработала вызов функции с этими данными в качестве параметра, а затем выполнила манипуляцию с заголовком, а затем, наконец, выполнила последнюю функцию res.render ().

Имейте в виду, что это файл route.js.

1 Ответ

0 голосов
/ 28 августа 2018

HTTP - это протокол запроса / ответа. Клиент делает запрос и получает один и только один ответ. Таким образом, вы никогда не сможете дважды позвонить res.render() по одному и тому же запросу.

Ваша проблема действительно определяется этой желаемой последовательностью:

  1. Клиент отправляет запрос
  2. Сервер начинает обрабатывать запрос
  3. Клиент показывает прогресс
  4. Сервер заканчивает обработку запроса
  5. Клиент показывает окончательный результат

Есть несколько способов сделать это:

Клиент использует Ajax вместо отправки формы для отправки запроса

  1. Клиент отправляет форму через Ajax вместо отправки формы
  2. Клиент отображает прогресс на странице с помощью DOM-манипуляции (изменение содержимого текущей страницы, обычно с отображением некоторого визуального наложения)
  3. Сервер работает по запросу, пока ничего не возвращает
  4. Сервер завершает запрос и возвращает ответ клиенту с одним res.render()
  5. Клиент либо вставляет возвращенный контент на текущую страницу, либо выдает window.location = xxxx, чтобы изменить текущую страницу, чтобы отобразить новый URL с новым содержимым.

Форма пост-ответа, использующая webSocket / socket.io для получения окончательных результатов

  1. Клиент отправляет форму
  2. Сервер немедленно возвращает страницу ответа, которая показывает пользовательский интерфейс выполнения / ожидания, и эта страница также соединяет соединение webSocket или socket.io с сервером
  3. Сервер работает по запросу
  4. Сервер принимает соединение webSocket или socket.io
  5. Сервер завершает запрос и отправляет некоторый тип результата через соединение webSocket / socket.io правильному клиенту
  6. Клиент получает ответ через webSocket / socket.io и либо обновляет содержимое текущей страницы, либо заменяет страницу новым URL-адресом

Все сделано через webSocket / socket.io

  1. Клиент загружает исходную страницу
  2. Клиент устанавливает соединение webSocket / socket.io с сервером
  3. Клиент отправляет данные формы на сервер через соединение webSocket / socket.io
  4. Клиент выставляет оверлей прогресса / ожидания
  5. Сервер начинает обработку запроса
  6. Сервер заканчивает обработку запроса
  7. Сервер отправляет ответ от запроса обратно клиенту через соединение webSocket / socket.io для этого клиента.
  8. Клиент получает ответ через соединение webSocket / socket.io и либо обновляет содержимое текущей страницы, либо меняет страницу на новый URL-адрес
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...