2016-01-13 59 views
0

我試圖發送HTTP POST使用參數一樣{name: myname}錯誤:無法設置頭髮送之後(不包括快遞和bodyparser)

後端代碼:

var qs = require('querystring'); 

     ... 
     case "POST": 

      if(request.url === "/api/user/delete"){ 

       //response.end('{}'); 
       var body = ''; 
       request.on('data', function (data) { 
        body += data; 
        // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB 
        if (body.length > 1e6) { 
         // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST 
         response.writeHead(413, {'Content-Type': 'text/plain'}).end(); 
         request.connection.destroy(); 
        } 
        else{ 
         response.writeHead(200, {"Content-Type": "application/json"}); 
         response.end(JSON.stringify(qs.parse(body))); 
        } 
       }); 
       request.on('end', function() { 
        // use POST 
        var POST = qs.parse(body); 
        console.log(POST); //log shows '{'{myname}':''}' i need output like {name:myname} 


       }); 
      } 
     ... 
+1

添加一張支票headersSent的'data'事件可以觸發一次以上。 – robertklep

+0

那麼,你打電話給'response.end(JSON.stringify(qs.parse(body)));'你的第一部分數據。下一個塊會出錯,因爲你已經發送了響應。這是一種預期的行爲。但沒有「那種」部分。 – cviejo

回答

0

理想情況下,你應該送對end響應事件的請求,以避免重新發送響應,因爲data事件可能發生多次。

如果你真的需要data發送事件本身response對象

request.on('data', function(data) { 
body += data; 
// 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB 
if (body.length > 1e6 && !response.headersSent) { 
    // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST 
    response.writeHead(413, { 
    'Content-Type': 'text/plain' 
    }).end(); 
    request.connection.destroy(); 
} else if (!response.headersSent) { 
    response.writeHead(200, { 
    "Content-Type": "application/json" 
    }); 
    response.end(JSON.stringify(qs.parse(body))); 
} 
}); 
相關問題