2017-05-08 5 views
0

私はサーバーを書いています。投稿すると、req.bodyがfsでファイルに保存されます。Nodejsは継続的にロードする

クライアント・ページは依然としてサブミット時にロードされますが、ライト・ファイルは非同期である必要がありますか、そうであれば、コールバックの外観はどのようになり、ページはまだロードされますか。

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

これは私が応答を送信しないためですか?

+0

さて、応答を送信して非同期機能に変更すると、サーバーが改善されますか? – Sprout

+0

サーバーが要求の処理を完了したことをクライアントに伝え、もう1つはサーバー全体の大きなボトルネックとならないようにします。 –

+0

私は応答を別のページに送信すると、私は応答を送信したいが、同じページにとどまりたい。それは可能ですか? – Sprout

答えて

2

はい、応答を送信していないためです。 Expressは自動的に応答を送信しないので、そのエンドポイントに送信するときに応答を返す必要があります。そうしないと、要求がハングします。

ファイルの書き込みは非同期である必要はありませんが、そうでなければなりません。これを行うには近代的な方法は、約束を使用することで、何かのような...

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(); 
    } 
); 

あなただけの、(それは低性能のサイトの場合は、する必要はありません)非同期にそれを行うにはしたくない場合do:

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

あなたのコードは、応答を無視する以外には問題ありません。応答を送信したり、手動でres.end()を呼び出して接続を終了しないと、サーバーがハングし、要求を行ったクライアントがタイムアウトします。

res.send()を呼び出すと、接続が終了し、クライアントに応答を送信して、少なくとも要求のステータスを知らせることができます。

文字列を返すだけで、ページがリロードされてはなりません。

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'); 
}) 
関連する問題