簡體   English   中英

Node.js拋出新的錯誤(“發送頭后無法設置頭。”);

[英]Node.js throw new Error('Can\'t set headers after they are sent.');

這個錯誤:

{}
_http_outgoing.js:335
    throw new Error('Can\'t set headers after they are sent.'); Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.setWriteHeadHeaders (D:\xampp\htdocs\wisaa\node_express\node_modules\morgan\node_modules\on-headers\index.js:80:19)
    at ServerResponse.writeHead (D:\xampp\htdocs\wisaa\node_express\node_modules\morgan\node_modules\on-headers\index.js:39:36)
    at ServerResponse.writeHeader (_http_server.js:233:18)
    at Object.queue.drain (D:\xampp\htdocs\wisaa\node_express\routes\index.js:52:13)
    at D:\xampp\htdocs\wisaa\node_express\node_modules\async\lib\async.js:871:23
    at D:\xampp\htdocs\wisaa\node_express\node_modules\async\lib\async.js:44:16
    at D:\xampp\htdocs\wisaa\node_express\routes\index.js:43:21
    at Socket.<anonymous> (D:\xampp\htdocs\wisaa\node_express\node_modules\email-verify\index.js:145:13)
    at Socket.emit (events.js:129:20)

npm ERR! Windows_NT 6.2.9200 npm ERR! argv "C:\\Program Files (x86)\\nodejs\\\\node.exe" "C:\\Program Files (x86)\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "start" npm ERR! node v0.12.5 npm ERR! npm  v2.11.2 npm ERR! code ELIFECYCLE npm ERR! node_express@0.0.0 start: `node ./bin/www` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node_express@0.0.0 start script 'node ./bin/www'. npm ERR! This is most likely a problem with the node_express package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR!     node ./bin/www npm ERR! You can get their info via: npm ERR!     npm owner ls node_express npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request: npm ERR!     D:\xampp\htdocs\wisaa\node_express\npm-debug.log`

這是我的代碼:

var express = require('express');
var router = express.Router();
var _ = require('underscore');
var fs = require('fs'),
    async = require('async'),
    verifier = require('email-verify');
/* GET home page. */

router.post('/', function(req, res, next) {

    var emails = req.body.emails;

    emails = emails.split(',');

    var queue = async.queue(function(task, callback) {
        task(callback);
    }, 100);
    _.each(emails, function(e, i) {
        queue.push(function(cb) {
            var done = false;
            verifier.verify(e, function(err, info) {
                if (err) {
                    //console.log(err);
                    // fauile
                    emails.splice(emails.indexOf(e), 1);
                    var score = "Your email is nor valid neither exist";
                } else {
                    if (info.success) {
                        // success
                        res.json({
                            'message': emails
                        });
                    } else {
                        emails.splice(emails.indexOf(e), 1);
                    }
                }
                if (!done) {
                    done = true;
                    cb(null, true);
                    console.log('something bad happened!');
                }
            });
        });

    });
    queue.drain = function() {
        console.log(arguments);
        res.writeHeader(200, {
            'content-Type': 'text/plain'
        });
        res.send(JSON.stringify(emails));
        res.end();
    }
});
module.exports = router;

看來您將對每個請求多次調用res.json() 這是不允許的,因為它發送響應(並且報頭也因此出錯)。 每個請求應該只有一個響應。

當您執行_.each ,您正在循環。 在這種情況下,您要向隊列添加一堆函數。 處理該隊列中的每個函數時,您正在調用res.json() res.json()發送一個響應,您只能執行一次,不能多次。

你可以做任何你在這個隊列中需要的,如果你需要,但實際上並不發送電子郵件的處理res.json直到調用回調,所以在drain

正如@Matt Harrison所指出的那樣,我試圖僅對其添加一點描述。

看起來像,

res.json({
            'message':emails
            });

首先被調用,它負責將json響應發送到客戶端,從而完成請求-響應周期。

因此,在此之后,對res對象的任何嘗試都是無關緊要的,因為已經發送了響應。

由於您正在遵循異常

new Error('Can\'t set headers after they are sent.');

因此,很可能會調用queue.drain()來設置標頭。 此時,您會收到錯誤消息。

嘗試:

verifier.verify(e, function(err, info) {
    if (err) {
       //Return the error itself
       return res.send(err);
       //The rest of your code here
       ...
}else{...}

您需要添加“返回”,這樣您就不會再次回答。 簡而言之,您的代碼需要有一個returnelse因此當出現錯誤時,您不必執行兩個代碼路徑。 我認為這就是錯誤的出處。

希望這可以幫助。!

暫無
暫無

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

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