簡體   English   中英

錯誤:發送標頭后無法設置標頭。 節點JS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM