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.
有人可以帮助我修复它吗? 非常感谢。
答案 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的工作原理!