节点。 Web更改的js服务器进程

时间:2018-10-11 08:08:44

标签: node.js node-modules

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.

有人可以帮助我修复它吗? 非常感谢。

2 个答案:

答案 0 :(得分:3)

正如Sashi正确说的那样,您无法通过API进行两次响应

尝试:

someUploadRoute.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时,您可以检查返回的值。部分伪代码如下:

someUploadComponent.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()));
}

答案 1 :(得分:2)

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

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

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

文件上传后,您将无法发送回响应。发送响应将完成您的API调用。然后,您将不得不单独致电以检查上传状态。我建议您从前端而不是API中显示一个响应,指出您的文件正在上传。

stackoverflow question有助于更好地了解res的工作原理!