Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 另一个函数要处理的快速退货邮件信息_Javascript_Node.js_Express_Routes_Header - Fatal编程技术网

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()
两次

您的问题实际上是由以下所需顺序定义的:

  • 客户端发送请求
  • 服务器开始处理请求
  • 客户端显示进度
  • 服务器完成处理请求
  • 客户端显示最终结果
  • 实现这一目标的方法有很多:

    客户端使用Ajax而不是表单post发送请求

  • 客户端通过Ajax而不是表单post提交表单
  • 客户端使用DOM操作在页面上显示进度(更改当前页面内容,通常显示某种类型的视觉覆盖)
  • 服务器根据请求工作,尚未返回任何内容
  • 服务器完成请求并使用一个
    res.render()将响应返回给客户端
  • 客户端将返回的内容插入当前页面,或发出
    window.location=xxxx
    更改当前页面以显示包含新内容的新URL
  • 形成post响应,使用webSocket/socket.io获得最终结果

  • 客户提交表格
  • 服务器立即返回显示进度/等待UI的响应页面,该页面还将webSocket或socket.io连接连接到服务器
  • 服务器应请求工作
  • 服务器接受webSocket或socket.io连接
  • 服务器完成请求并通过webSocket/socket.io连接将某种类型的结果发送到正确的客户端
  • 客户端通过webSocket/socket.io接收响应,并更新当前页面的内容或将页面更改为新的URL
  • 全部通过webSocket/socket.io完成

  • 客户端加载原始页面
  • 客户端建立到服务器的webSocket/socket.io连接
  • 客户端通过webSocket/socket.io连接将表单数据发送到服务器
  • 客户端显示进度/等待覆盖
  • 服务器开始处理请求
  • 服务器完成处理请求
  • 服务器通过该客户端的webSocket/socket.io连接将请求的响应发送回客户端
  • 客户端通过webSocket/socket.io连接接收响应,并更新当前页面的内容或将页面更改为新的URL

  • res函数应该始终是最后一次调用。你不能有多个
    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()的内容?