app.post('/pst', function(req, res) {
var data = req.body.convo;
myFunc(data).then(result => {
//---------------------------------
//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);
res.redirect(`/success`); //THEN THIS
//--------------------------------------
}).catch( .....
Когда вы добавляете промежуточное программное обеспечение для Express (которое построено на Connect) с помощью метода app.use, вы добавляете элементы в Server.prototype.stack
в Connect.
Когда сервер получает запрос, он выполняет итерацию по стеку, вызывая метод (request, response, next).
Проблема в том, что если в одном из элементов промежуточного программного обеспечения выполняется запись в тело или заголовки ответа (похоже, это либо / или по какой-то причине), но не вызывается response.end()
и вы вызываете next()
, тогда как базовый метод Server.prototype.handle завершается, он заметит, что:
there are no more items in the stack, and/or
that response.headerSent is true.
Итак, выдает ошибку. Но ошибка, которую он выдает - это просто базовый ответ (из исходного кода connect http.js:
res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('Cannot ' + req.method + ' ' + req.url);
Проблемное промежуточное ПО устанавливает заголовок ответа без вызова response.end()
и вызывает next (), что сбивает с толку сервер Express.
поэтому вы устанавливаете заголовок через res.render()
. Теперь, если вы попытаетесь выполнить рендеринг снова, вы получите ошибку.
app.get('/success',(req,res)=> {
res.render("container/index",{waiting:"waiting",......});
//handle your task then in client side index.ejs with appropriate setTimeout(()=>{},2000) for the waiting div , show waiting div for 2 seconds
});
//then your actual success gets render