Подтвердить что ты не робот

Node.js POST вызывает ошибку [Ошибка: сокет]: "ECONNRESET"

Я создал образец для отправки данных в службы отдыха, и я узнал, что когда у меня есть символ non-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)

если заменить значение firstName с 'JoaquÌn' на 'abc', все работает отлично. Я думаю, что мне не хватает чего-то, чтобы поддержать или убежать, чтобы заставить его работать.

Кто-нибудь знает, как я решаю эту проблему? Я также пробовал следующее: require ('querystring'). Escape (model.givenName), и он работает, но я не доволен им.

ОБНОВЛЕНО Я узнал, что если я прокомментирую: app.use(express.bodyParser()), ошибка исчезнет.

4b9b3361

Ответ 1

Это проблема node, а не проблема. https://github.com/visionmedia/express/issues/1749

для решения, измените с

'Content-Length': data.length

to

'Content-Length': Buffer.byteLength(данные)

ПРАВИЛО THUMB

Всегда используйте Buffer.byteLength(), когда вы хотите найти длину содержимого строк

ОБНОВЛЕНО

Мы также должны корректно обрабатывать ошибки на стороне сервера, чтобы предотвратить сбой путем добавления промежуточного программного обеспечения для его обработки.

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

Ответ 2

Проблема заключается в том, что если вы не справитесь с этой ошибкой и сохраните сервер в живых, этот удаленный краш-эксплойт может быть использован для атаки DOS. Тем не менее, вы можете справиться с этим и продолжить работу и все еще отключать процесс, когда происходят необработанные исключения (что мешает вам работать в состоянии undefined - очень плохо).

Модуль подключения обрабатывает ошибку и вызывает 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();
});