簡體   English   中英

Node.js POST導致[錯誤:套接字掛起]代碼:'ECONNRESET'

[英]Node.js POST causes [Error: socket hang up] code: 'ECONNRESET'

我創建了一個將數據發布到休息服務的示例,我發現當我有非ascii或非拉丁字符時(請參閱data.firstName),我使用TEST-REST.js的帖子請求會拋出

錯誤:{[錯誤:套接字掛斷]代碼:'ECONNRESET'}。

// TEST-REST.js
var http = require('http');

var data = JSON.stringify({
  firstName: 'JoaquÌn',
});

var options = {
  host: '127.0.0.1',
  port: 3000,
  path: '/users',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': data.length
  }
};

var req = http.request(options, function(res) {
  var result = '';

  res.on('data', function(chunk) {
    result += chunk;
  });

  res.on('end', function() {
    console.log(result);
  });
});

req.on('error', function(err) {
  console.log(err);
});

req.write(data);
req.end();

在我的休息服務,它給我這樣的錯誤:

SyntaxError: Unexpected end of input Sun Sep 08 2013 23:25:02 GMT-0700 (PDT) -     at Object.parse (native)
    at IncomingMessage.<anonymous> (/Volumes/Data/Program_Data/GitHub/app/node_modules/express/node_modules/connect/lib/middleware/json.js:66:27) info    at IncomingMessage.EventEmitter.emit (events.js:92:17)
    at _stream_readable.js:920:16 : - - - [Mon, 09 Sep 2013 06:25:02 GMT] "POST /users HTTP/1.1" 400 - "-" "-"
    at process._tickDomainCallback (node.js:459:13)

如果我將'JoaquÌn'中的firstName值替換為'abc',一切正常。 我想我錯過了一些支持或逃避的東西讓它發揮作用。

有誰知道我是如何解決這個問題的? 我也試過以下:require('querystring')。escape(model.givenName),它可以工作,但我對它不滿意。

更新我發現如果我注釋掉:app.use(express.bodyParser());,錯誤就會消失。

這是節點的問題,而不是明確的問題。 https://github.com/visionmedia/express/issues/1749

解決,改變

'Content-Length':data.length

'Content-Length':Buffer.byteLength(數據)

規則

當您想要查找字符串的內容長度時,請始終使用Buffer.byteLength()

更新

我們還應該優雅地在服務器端處理錯誤,以防止通過添加中間件來處理它而導致崩潰。

app.use(function (error, req, res, next) {
  if (!error) {
    next();
  } else {
    console.error(error.stack);
    res.send(500);
  }
});

問題是,如果您不處理此錯誤並使服務器保持活動狀態,則此遠程崩潰漏洞可用於DOS攻擊。 但是,您可以處理它並繼續,並在未處理的異常發生時仍然關閉進程(這會阻止您在未定義的狀態下運行 - 這是一件非常糟糕的事情)。

connect模塊處理錯誤並調用next() ,發回一個帶有消息體和status = 400 在您的服務器代碼中,您可以在express.bodyParser()之后添加它:

var exit = function exit() {
  setTimeout(function () {
    process.exit(1);
  }, 0);
};

app.use(function (error, req, res, next) {
  if (error.status === 400) {
    log.info(error.body);
    return res.send(400);
  }

  log.error(error);
  exit();
});

暫無
暫無

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

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