2017-10-19 1 views
0

Ich versuche hier etwas kompliziert zu machen, ich lade eine Datei mit erfolgreich in MemoryStorage. Der Punkt ist, dass ich die Datei aus dem Speicher nehmen und an einen anderen Server senden muss. Hier ist, was ich tue:Hochladen von Dateien mit Knoten/multer/axios

var express = require('express'); 
var router = express.Router(); 
var path = require('path'); 
const multer = require('multer'); 
const FormData = require('form-data'); 

router.post('/files', upload.single('file'), function (req, res) { 

    const axios = require('axios'); 

    const url = configuration.dataHub.url + '/api/files'; 

    var config = { 
     headers: {'x-token': req.session.token, 'Content-Type': 'application/json'} 
    }; 

    const form = new FormData(); 
    form.append('file', req.file.buffer); 

    if (req.session.hasOwnProperty('token')) { 

     axios.post(url, form, config) 
      .then(response => { 

       if (response.data.success) { 
        console.log("Arquivo enviado"); 

        res.send({ 
         success: true, 
         message: 'Arquivo enviado com sucesso!' 
        }); 
       } else { 
        console.log("Arquivo nao enviado"); 

        res.send({ 
         success: false, 
         message: "Houve um problema ao enviar a ficha, verifique sua conexão ou tente novamente mais tarde." 
        }); 
       } 

      }) 
      .catch((error) => { 
       console.log("N Enviado", error.message); 
       res.send({ 
        success: false, 
        message: "Houve um problema ao enviar o arquivo, verifique sua conexão ou tente novamente mais tarde." 
       }); 
      }); 

    } else { 
     res.send({ 
      success: false, 
      session: false, 
      message: "Sua sessão expirou após 5 minutos sem uso. Faça login novamente!" 
     }); 
    } 
}); 

diesen Code verwenden, erhalte ich die Fehlermeldung:

write after end

Alle Lösungen für das?

+0

, dass Fehler mit einem Stack-Trace kommen tun? Welche Teile Ihrer Konsolenprotokollierung sehen Sie vor der Fehlermeldung? Wird der Fehler als Teil Ihrer 'N Enviado' Protokollierung protokolliert? – skirtle

+0

Ja, ist das "Schreiben nach Ende" – erickles

Antwort

0

Statt res.send() versuchen res.write() zu verwenden und eine res.send() am Ende Ihres Codes zu verwenden, wo Sie denken, Sie die gesamte Verarbeitung beendet haben, und diese res.send() soll dies hilft mit einer res.end()

Hoffnung gefolgt sein !.

+0

Haben Sie einen Code snnipet? Weil ich das auf allen meinen Routen mache ... – erickles

0

ich auf Anfrage js geändert, auf diese Weise zu tun, funktioniert gut:

formData = { 
      file: { 
       value: file.buffer, 
       options: { 
        filename: file.originalname, 
        contentType: file.mimetype 
       } 
      } 
     }; 

     var options = { 
      url: url, 
      headers: { 
       'x-token': req.session.token 
      }, 
      formData: formData 
     }; 

     request.post(options, function optionalCallback(err, httpResponse, body) { 

      if (err) { 
       res.send({ 
        success: false, 
        session: true, 
        message: 'There is a problem sending the files!' 
       }); 
      } else { 

       result = result.concat(JSON.parse(body)); 

       res.send({ 
         success: true, 
         session: true, 
         message: 'sucess!', 
         files: result 
        });            

      } 

     });