2017-05-08 3 views
0

Ich schreibe einen Server und auf Post speichert es die req.body in eine Datei mit fs.Nodejs Beitrag kontinuierlich laden

Die Clientseite wird weiterhin beim Senden geladen, muss die Write-Datei asynchron sein und wenn ja, wie sollte der Callback aussehen und warum wird die Seite noch geladen?

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
}) 

Ist dies, weil ich keine Antwort senden?

+0

Okay, das Senden einer Antwort und das Ändern in eine asynchrone Funktion wird meinen Server verbessern? – Sprout

+0

yup. einer würde dem Client sagen, dass der Server die Anfrage bearbeitet hat, der andere würde verhindern, dass diese Route ein riesiger Flaschenhals für den gesamten Server ist. –

+0

Wenn ich also eine Antwort sende, wechselt sie auf eine andere Seite, ich möchte eine Antwort senden, aber auf der gleichen Seite bleiben. Ist das möglich? – Sprout

Antwort

2

Ja, das liegt daran, dass Sie keine Antwort senden. Express sendet nicht automatisch eine Antwort. Wenn Sie also einen Post an diesen Endpunkt senden, müssen Sie eine Antwort zurückgeben, da die Anforderung andernfalls nicht reagiert.

Die Datei schreiben muss nicht asynchron sein, aber es sollte sein. Der moderne Weg, dies zu tun ist, Versprechen zu verwenden, so etwas wie ...

new Promise(function(resolve, reject) { 
    fs.writeFile('data.txt', JSON.stringify(req.body), (err) => 
    { 
     if (err) reject(err); 
     else resolve(data); 
    } 
}).then(
    (success) => res.send(success) 
).catch(
    (err) => { 
     console.log(err); 
     res.status(500).send(); 
    } 
); 

Wenn Sie nicht wollen, es zu tun async (Sie nicht brauchen, wenn es eine Low-Performance-Website), um nur tun:

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
    res.send({"status": 200}); 
}) 
1

Ihr Code ist in Ordnung, außer zu vernachlässigen, eine Antwort zu senden. Wenn Sie die Verbindung nicht beenden, indem Sie eine Antwort senden oder res.end() manuell aufrufen, wird Ihr Server hängen und der Client, der die Anforderung absetzt, wird Zeitüberschreitung.

Der Aufruf res.send() beendet die Verbindung für Sie und sendet eine Antwort an den Client, um sie zumindest über den Status der Anforderung zu informieren.

Das Zurücksenden nur einer Zeichenfolge sollte nicht zum erneuten Laden der Seite führen.

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
    // Set status code to 200, send string response 
    res.status(200).send('Ok'); 
})