2015-08-28 83 views
0

此錯誤:Node.js拋出新的錯誤('發送後無法設置標題'。

{} 
_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! [email protected] start: `node ./bin/www` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the [email protected] 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; 
+0

這是我的第一個問題,所以謝謝你正確的方式! – Saurabh

+0

如果它看起來適合你,你可以接受編輯。 – guptakvgaurav

回答

1

看起來你將調用每個請求res.json()一次或多次。這是不允許的,因爲它發送的響應(和標題因此錯誤)。每個請求只能有一個響應。

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

如果需要,您可以對此隊列中需要的電子郵件進行任何類型的處理,但實際上並沒有將它與res.json一起發送,直到調用回調爲止,因此在drain中。

+0

您的意思是發送郵件:'emails'in drain – Saurabh

+0

任何人都可以請解釋我。我真的很新node.js – Saurabh

0

正如@Matt Harrison所指出的那樣,我只是想給它添加一些描述。

它看起來像,

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

獲取調用第一負責發送JSON響應給客戶端,因此,在完成請求響應週期。

因此,在此之後,任何對res對象的嘗試都不重要,因爲響應已經發送。

既然你得到以下異常

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

所以,最有可能,queue.drain()被調用,它是設置標題。此時您正在收到錯誤。

+0

res.send(JSON.stringify(emails));所以我應該刪除這條線 – Saurabh

+0

你不應該在drain()中使用'res'。這沒有意義,因爲迴應已經發出。 – guptakvgaurav

+0

@Saurabh你應該只在排水溝中使用'res',因爲這是你唯一準備好你的迴應的地方,2)可以肯定的只是調用一次。 –

0

嘗試:

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

你需要添加的「迴歸」讓你不回覆的兩倍。簡而言之,您的代碼需要有returnelse,所以當出現錯誤時您不會執行這兩個代碼路徑。這就是我認爲的錯誤來源。

希望這會有所幫助。

相關問題