1
app.post('/upload',upload.array('photos',30),function(req,res,next){
    for (var index in req.files)
        {    
        var file = req.files[index];
        var loc = file.destination;
        var output= uploadFolder+req.body.user+'/download/'+formatDate();
        };
    console.log('output: '+output);
    console.log('loc: '+loc);
    var cmd = 'python demo.py -i '+loc+' -o '+output+' --isDlib True'; //cmd demo.py 
    // res.write('File Processing..');

    child_process.exec(cmd,function(err,stdout,stderr){            
        var fileLocation = output+'.zip';
        console.log(fileLocation);

        zipFolder(output,fileLocation, function(err) {

            if(err) {
                console.log('oh no!', err);
            } else {

                console.log('EXCELLENT');
                res.download(fileLocation,'Files');                    
                // res.redirect('/form');                  
            }
        });                 
   }); 
});

大家好,我刚开始使用 Node,我尝试构建一个简单的服务器来让用户上传他们的图像。然后图像将由 python 更改为 3D。

现在我想在用户等待文件传输完成时显示一条消息。

我尝试在 child_process 之前通过 response.write 发送消息,最后我希望通过路由重定向网站。

但我总是得到错误(我注释掉的代码。): Can't set headers after they are sent.

有人可以帮我解决吗?非常感谢。

4

2 回答 2

3

正如 Sashi 所说的那样,你不能从你的 API 响应两次

尝试:

一些上传路由.js:

...
..
console.log(fileLocation);
zipFolder(output,fileLocation, function(err) {
  if (err) {
    myMessage="error encountered on upload"
    console.log(myMessage, err);
    res.json({success:false, error:err});
  }
  else {
    myMessage = "upload successful";
    console.log(myMessage);
    res.download(fileLocation, 'Files');
  }
)}

编辑以向前端显示消息:

当您的 someUploadComponent.ts 调用您的 someUploadService.service.ts 时,您可以检查返回的值。部分伪代码如下:

一些上传组件.ts:

   this.someUploadService.upload(args).subscribe(uploadResponse => {
     if (uploadResponse.success == false) { // will be undefined if no err
       display err message in dialog or whateva
     }
     else {
       do whatever..
     }

someUploadService.service.ts:

upload(args) {
   return this.http.post('http://somehost:3000/fileOps/upload',user).pipe(map(res => res.json()));
}
于 2018-10-11T08:32:09.523 回答
2

您的代码的问题是,一旦您调用res.sendAPI 的响应就会返回(在第 74 行)。

因此,您会收到错误Can't set headers after they are sent消息,因为节点已返回 res 对象。

在第 88 行调用res.redirect也有同样的效果。

上传文件时,您无法发回响应。发送响应将完成您的 API 调用。您必须单独拨打电话以检查上传状态。我建议从前端而不是 API 显示您的文件正在上传的响应。

这个stackoverflow 问题将有助于更好地理解 res 的工作原理!

于 2018-10-11T08:24:14.270 回答