簡體   English   中英

錯誤發送到客戶端后無法設置標頭

[英]error Cannot set headers after they are sent to the client

我在我的 controller 中為 express.js 中的發布路線執行此操作

exports.post_record = (req, res) => {

        //it's not actually needed but i am doing this just for sake of checking
    if (!req.file) {
        return res.status(422).json({
            message: 'The file is required.'
        });
    }

    //checking if file is empty
    if (req.file.size == 0) {
       return res.status(400).send("file is empty");
    }

    try {
        // result storing object
        const results = {
            P: 0,
            QRS: 0,
            meanFrequency: 0,
            minFrequency: {
                value: 9999999,
                time: 0
            },
            maxFrequency: {
                value: 0,
                time: 0
            }
        };

        //for mean frequency calculation
        const frequencyCollector = {
            sumOfFrequency: 0,
            cycleCount: 0
        };

        //entries of valid wave type object to check if the wave type in our csv are valid data-sets
        const expectedWave = {
            P: true,
            QRS: true,
            T: true,
            INV: true
        };

        let time = 0;
        let lastTimeStamp = 0;

        readLine.createInterface({
            input: fs.createReadStream(req.file.path)
        }).on("line", line => {
            const cols = line.split(",");
            const waveType = cols[0];
            const startTime = cols[1];
            const endTime = cols[2];
            const tags = cols.slice(3);

            //just to make sure csv has valid data list
            if (!(waveType in expectedWave && Number(startTime) >= 0 && Number(endTime) > 0)) {
               res.status(500).send("File data entry is not in supported format");
               return;
            }
                
            if ((waveType === "P" || waveType === "QRS") && tags.includes("premature")) {
                results[waveType]++;
            }

            time += (cols[2] - cols[1]);
            time += (cols[1] - lastTimeStamp);
            lastTimeStamp = cols[2];

            if (waveType === "QRS") {
                let frequency = Math.floor((60 / time) * 1000);

                //check if frequency is maxValue or minValue
                if (frequency > results.maxFrequency.value) {
                    results.maxFrequency.value = frequency;
                    results.maxFrequency.time = Number(cols[2]);
                }

                if (frequency < results.minFrequency.value) {
                    results.minFrequency.value = frequency;
                    results.minFrequency.time = Number(cols[2]);
                }

                frequencyCollector.sumOfFrequency += frequency;
                frequencyCollector.cycleCount++;
                time = 0;
            }

        }).on("error", (err)=>{
            return res.status(500).send(`error is: ${err.message}`);
        }).on("close", () => {
            let heartRate = Math.floor(frequencyCollector.sumOfFrequency / frequencyCollector.cycleCount);
            results.meanFrequency = heartRate;
            results.maxFrequency.time += Number(req.body.time);
            results.minFrequency.time += Number(req.body.time);
            res.status(200).json(results);
            return;
        });

    }
    catch (err) {
       console.error(err);
       res.status(500).send(`there is an error with message: ${err.message}`);
       return;
    }
}

如果沒有錯誤情況並拋出錯誤,則此代碼可以正常工作

代碼:'ERR_HTTP_HEADERS_SENT'

當我發送任何導致錯誤或提前終止操作的情況時,例如

 if (!(waveType in expectedWave && Number(startTime) >= 0 && Number(endTime) > 0)) {
               res.status(500).send("File data entry is not in supported format");
               return;
  }

如果這種情況在這段代碼中得到滿足!!!

我知道這個錯誤

拋出新的 ERR_HTTP_HEADERS_SENT('set'); ^ 錯誤 [ERR_HTTP_HEADERS_SENT]: 發送到客戶端后無法設置標頭

如果存在具有特定狀態的響應並再次嘗試設置響應的狀態,則拋出。 為了避免這種情況,我在每個響應返回語句中都寫了一個返回,但沒有結果。

有什么你可以幫忙的嗎,我確信有些東西我看不到。

還有一件事我正在使用 Axios 發送表單數據

axios({
         method: 'post',
         url: '/POST/delineation',
         data: formData,
         config: { headers: {'Content-Type': 'multipart/form-data' }
}

我知道使用 xhr 我們不需要自己設置配置,因為 ajax 會自己設置邊界。 我不知道我是否應該將配置放在 Axios 中。 如果我不把它放在 Axios 中,Axios 會自己放嗎?

提前致謝 !!!

找不到文件時,您似乎沒有返回響應

  if (!req.file) {
    return res.status(422).json({
      message: "The file is required.",
    });
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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