2017-02-18 5 views
-1

Sorry, ich neige dazu, ein schlechter Schriftsteller zu sein, wenn ich nicht vollständig aufgewacht bin, lass mich revidieren.Express-Node-Server einen Wert zurückgeben async Client Anruf

Ich benutze expressjs mit Passjs (lokale Strategie), um meinen Server zu verwalten und connect-busboy zu verwenden, um das Hochladen von Dateien zu verwalten. Ich glaube nicht, dass der Pass eine Rolle spielen wird.

Hier ist der Server-Code ist das Hochladen von Dateien für die Verwaltung:

app.post('/upload', isLoggedIn, (req, res) => { 
     if(req.busboy){ 
      req.pipe(req.busboy); 
      req.busboy.on('file', (fieldname, file, filename, encoding, mimetype) => { 
       if(mimetype.match(/^image\//)){ 
        var root = path.join(__dirname, "../public/images/"); 
        if(fs.existsSync(path.join(root, filename))){ 
         var name = getUnique(path.join(root, filename)); 
        } else { 
         var name = filename; 
        } 
        var ws = fs.createWriteStream(path.join(root, name), { flags: "a" }); 
        file.pipe(ws); 
       } 
      }); 
     } 
    }); 

Was meine Client-Seite wird verwendet, um ein JSON-Objekt zu ändern, die neu auf den Server geladen als Konfigurations-Tool erhalten. Wenn ich ein neues Bild asynchron hochlade, muss ich den Dateinamen holen, um dieses JSON-Objekt zu aktualisieren, während ich daran arbeite. Für das Hochladen von den Clients verwende ich dropzonejs, die keine Konfiguration von meinem Teil benötigt, um zu arbeiten.

Also, in der Zusammenfassung ich eine Reihe von Bildern per Dropzone asynchron hochladen, Busboy und fs auf meinem Server speichern Sie die Datei, und ich möchte den Dateinamen an mein Javascript zurückgegeben, um das vorhandene JSON-Objekt zu ändern.

bearbeiten Lösung:

Dank Elliot Blackburn für mich in die richtige Richtung.

Durch den Aufruf:

ws.on('close',() => { 
    res.send({filename: name}); 
}); 

nach file.pipe(ws); die Antwort zurück an den Client zu senden. Auf der Clientseite ändert Dropzone die Antwort wie so zu handhaben:

dropzone.on('success', (file, res) => { 
    console.log(res); 
}); 

Antwort

1

es einfach in der normalen HTTP-Antwort senden. Es hängt davon ab, welche Bibliothek Sie verwenden, aber die meisten erlauben es Ihnen, einen normalen req, res, next express call auszulösen. Von diesem können Sie auf das Dateiobjekt zugreifen und alles zurückgeben, was Sie wollen.

Etwas wie:

req.send({filename: name}); // name is the filename var set earlier in the code. 

Sobald Sie die Datei Bearbeitung beendet haben und so können Sie den Namen bekommen und es in diesem zurückgegebene Objekt und Ihr Kunde wird, dass als Antwort als Objekt erhalten die Sie kann handeln.

+0

Danke, mit diesem und Blick in die Dropzone-API, mit Dropzone.on ('Erfolg', (Datei, Res) => {console.log (res)} Ich konnte den Dateinamen zurück es war res.send.wird den Beitrag mit der Lösung aktualisieren – Drew

+0

@Dread fantastisch, froh, dass du die Antwort gefunden hast –