Node.js HTTP - TypeError:标头内容包含无效字符

Ale*_*lls 6 http http-post node.js nodejs-stream

const http = require('http');

const req = http.request({
  method: 'POST',
  hostname: 'cloudsso?test.myco.com',
  port: 80,
  path: '/as/token.oauth2',
  headers: {
    'Content-Type': 'application/json',
  },
  agent: false  // create a new agent just for this one request

}, function (res) {

  res.on('headers', function (h) {
    console.log('headers => ', h);
  });

  let data = '';

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

  res.once('end', function () {
    console.log('data => ', data);
  });

});

req.write(JSON.stringify({
  client_id: 'xxx',
  client_secret: 'secret',
  grant_type: 'refresh_token',
}));

req.end();
Run Code Online (Sandbox Code Playgroud)

我运行此代码,我收到以下错误:

_http_outgoing.js:358
    throw new TypeError('The header content contains invalid characters');
    ^

TypeError: The header content contains invalid characters
    at ClientRequest.OutgoingMessage.setHeader (_http_outgoing.js:358:11)
    at new ClientRequest (_http_client.js:105:12)
    at Object.exports.request (http.js:31:10)
    at Object.<anonymous> (/Users/alexamil/WebstormProjects/cisco/cdt-now/test/refresh-token.js:9:18)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
Run Code Online (Sandbox Code Playgroud)

无法弄清楚这个错误来自哪里.我听说这是出于安全原因在较新版本的Node中,但无法弄清楚如何绕过它.

Ale*_*lls 6

直截了当,看起来我们需要使用:

 headers: {
    'content-type': 'application/json',
  },
Run Code Online (Sandbox Code Playgroud)

代替

 headers: {
    'Content-Type': 'application/json',
  },
Run Code Online (Sandbox Code Playgroud)

这些类型的模糊错误信息让我很难过!


Jus*_*use 6

我有一个类似的问题,我正在为Authorization生成一个jwt令牌,它正在插入换行符.替换那些token.replace(/\r?\n|\r/g, '')为我做了诀窍.


Ali*_*tan 6

这不是原因。这是因为你的破折号 \xe2\x80\x90 不是标准破折号:

\n\n
> /-/.test('cloudsso\xe2\x80\x90test.myco.com')\nfalse\n\n> /\xe2\x80\x90/.test('cloudsso\xe2\x80\x90test.myco.com')\ntrue\n
Run Code Online (Sandbox Code Playgroud)\n