Javascript 另一个函数要处理的快速退货邮件信息
我有以下代码:Javascript 另一个函数要处理的快速退货邮件信息,javascript,node.js,express,routes,header,Javascript,Node.js,Express,Routes,Header,我有以下代码: 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
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( .....
我想做的是当有帖子的时候,
1.抓取帖子信息
2.做一个res.render()
3.以post信息作为参数运行函数
4.执行此代码段,以允许客户端以.txt文件的形式从内存下载内容
5.做另一个res.render()
如果排除两个res.render(),一切都会正常工作。在我做了一个之后,我无法设置标题。我得到这个错误
Error: Can't set headers after they are sent.
所以我想到了一个可能的解决办法
app.post()是否可能获取post数据并执行res.render()
然后,返回post数据,代码的另一部分将处理使用此数据作为参数调用函数,然后执行头操作,最后执行最后一个res.render()
请记住这是routes.js文件。HTTP是一种请求/响应协议。客户机发出请求并返回一个且仅一个响应。因此,对于同一请求,您永远不能调用
res.render()
两次
您的问题实际上是由以下所需顺序定义的:
res.render()将响应返回给客户端
window.location=xxxx
更改当前页面以显示包含新内容的新URLres函数应该始终是最后一次调用。你不能有多个
res.render()
s。这就是为什么我问我是否在这里只做一个res.render,但我将post数据发送到其他地方进行处理,我可以在其他地方进行处理。你在代码的哪一部分发送要处理的数据?myFunc(数据)。然后(结果。数据是来自POST的数据,myFunc是一个异步函数。是的,但是当我认为我已经完成应用程序时,您仍在使用相同的res
。。现在我必须学习socket.io lol。谢谢您的回答。@user1584421-第一个选项不需要socket.io。如果您没有其他理由使用socket.io,我认为第一个选项可以很好地工作,除非您的服务器处理请求的时间太长,以至于浏览器超时。我不知道Ajax。而且我对时间很紧张。您是否知道一个教程会介绍JU,或者甚至是这里的一个问题,或者可能是第一个选项的一段代码?@user1584421-您是否使用任何客户端框架(如jQuery)内置简单的Ajax支持?对于现代浏览器,这些浏览器中的内置框架非常易于使用。没有它的所有节点和express。客户端是最小的。我是否应该读一读关于fetch()的内容?