Узел.Процесс сервера js с изменением сети - PullRequest
0 голосов
/ 11 октября 2018
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 и попытался создать простой сервер, чтобы позволить пользователю загружать свои изображения.Затем изображение будет изменено на 3D с помощью python.

Теперь я хочу отобразить сообщение, когда пользователь ожидает завершения передачи файла.

Я попытался отправить сообщение в ответ. напишите перед child_process, и в конце я хочу перенаправить сайт по маршруту.

Но я всегда получаю ошибку (коды, которые я комментирую.): Can't set headers after they are sent.

Может кто-нибудь помочь мне это исправить?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Как правильно сказал Саши, вы не можете дважды ответить от своего 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()));
}
0 голосов
/ 11 октября 2018

Проблема с вашим кодом заключается в том, что после вызова res.send будет возвращен ответ вашего API (в строке 74).

Следовательно, вы получаете ошибку Can't set headers after they are sent, потому что объект res уже был возвращен узлом.

Вызов res.redirect в строке 88 также имеет тот же эффект.

Невозможно отправить ответ обратно во время загрузки файла.Отправка ответа завершит ваш вызов API.И вам нужно будет сделать отдельный звонок, чтобы проверить статус вашей загрузки.Я бы порекомендовал показать ответ, что ваш файл загружается, из интерфейса, а не из API.

Этот вопрос stackoverflow будет полезен для лучшего понимания того, как работает res!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...