[英]Error: Can't set headers after they are sent. NodeJS
我有一個小問題,誰阻止了我。 我用nodeJS創建了一個小API,我想發送文件內容。
我用角度恢復數據。
錯誤:發送標頭后無法設置標頭。
router.get('/posts', (req, res) => {
fs.readdir('./maps', function(error, files) {
if(error)
throw error;
files.forEach(file => {
fs.readFile(file, (err, data) => {
res.send(data);
});
});
})
});
感謝幫助。
好吧,您不能發送對該請求的多個響應。 您必須同步讀取所有文件,並對獲得的所有文件進行一次重新發送。
您不能在for循環中調用res.send()。 它只需要執行一次,因為它將響應發送回api的調用者。 您可以做的是將響應串聯在for循環中,並在最后發送。
router.get('/posts', (req, res) => {
fs.readdir('./maps', function(error, files) {
if(error)
throw error;
var responseData = '';
files.forEach(file => {
fs.readFile(file, (err, data) => {
responseData += data;
});
});
res.send(responseData);
})
});
問題是在上面的代碼中,您每次讀取文件時都嘗試發送響應
files.forEach(file => {
fs.readFile(file, (err, data) => {
res.send(data);//repeated sending of response
});
});
如果您打算在讀取所有文件后發送響應,則需要並行讀取,一旦完成所有讀取,則可以發送響應。 為此,您可以使用async或promise庫,它可以幫助您輕松完成此操作
async.each(files, function(file, callback) {
fs.readFile(file, (err, data) => {
callback();
});
}, function(err) {
res.send(data);
});
結果,只有讀取了所有文件后,才發送響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.