Javascript Node.js HTTPS.get返回状态代码406

Javascript Node.js HTTPS.get返回状态代码406,javascript,node.js,http,https,Javascript,Node.js,Http,Https,我试图向API发出一个HPPTS请求,只使用内置的HTTPS模块。返回的状态代码是406,我还收到一个缓冲区错误: TypeError: buf.copy is not a function at Function.Buffer.concat (buffer.js:240:9) at IncomingMessage.<anonymous> (/var/task/index.js:562:41) at emitNone (events.js:72:20) at IncomingMess

我试图向API发出一个HPPTS请求,只使用内置的HTTPS模块。返回的状态代码是406,我还收到一个缓冲区错误:

TypeError: buf.copy is not a function
at Function.Buffer.concat (buffer.js:240:9)
at IncomingMessage.<anonymous> (/var/task/index.js:562:41)
at emitNone (events.js:72:20)
at IncomingMessage.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:905:12)
at nextTickCallbackWith2Args (node.js:437:9)
at process._tickDomainCallback (node.js:392:17)
在响应端,responseText只是一个空格

那么我做错了什么?谢谢你的帮助和耐心

编辑:同样值得注意的是,如果我将Buffer.concat行更改为var responseString=responseBuffer.join();在回调(JSON.parse(responseString))上,错误变成这样;线路

SyntaxError:输入意外结束
at Object.parse(本机)
在收到消息时。(/var/task/index.js:564:27)
在emitNone(events.js:72:20)
在IncomingMessage.emit(events.js:166:7)
在endReadableNT(_stream_readable.js:905:12)
在下一次使用2args进行回调时(node.js:437:9)
在进程中。_tickDomainCallback(node.js:392:17)

基于以下文档,Buffer.concat需要
缓冲区列表或Uint8Array
作为参数

在将字符串推送到数组之前,可以尝试以下方法将其转换为缓冲区

response.on('data', function(d) {
    responseBuffer.push(Buffer.from(d, 'utf8'));
});
请在此处查看详细问题


希望有帮助

看起来有两个不同的问题:

  • 调用
    response.setEncoding('utf8')
    时,节点会自动将传入数据转换为字符串。这意味着
    数据
    事件使用字符串触发,而不是
    缓冲区
    s

    这意味着您需要将流保持在二进制模式(通过不调用
    setEncoding
    ),保持缓冲区数组,然后在末尾将它们连接并转换为字符串

    response.on('end', function() {
      try {
        var responseString = Buffer.concat(responseBuffer).toString('utf8');
        resolve(JSON.parse(responseString));
      } catch(ex) {
        reject(ex);
      }
    });
    
    …或保留
    setEncoding
    调用并执行简单的字符串连接

    response.on('data', function(str) {
      responseString += str;
    });
    
    我建议使用前者以获得更好的性能(节点必须执行一些内部缓冲以处理流模式下的多字节字符)

  • 您使用的API返回的是406(不可接受)。这可能意味着您必须在请求中提供
    Accept
    标题


u可以切换到使用“提取”。。不幸的是,我需要使用HTTPS.getIs
responseBuffer.push(d)d缓冲区?responseBuffer是一个数组,d是一个字符串。然后我认为这就是问题所在。谢谢你的响应,将该行更改为responseBuffer.push(buffer.from(d,'utf8'));抛出错误“TypeError:utf8不是函数”。但我认为主要的问题不是缓冲区,而是我如何提出请求。我将意外的输入结束错误作为编辑添加到主帖子中。再次感谢!我认为
TypeError:buf.copy不是一个函数
表明这是因为缓冲区。可能使用类似于缓冲区的东西。来自(d)。顺便问一下,您的节点版本8.6.0是什么,您对SyntaxError:输入意外结束问题有何看法?responseString是从缓冲区加入的。我认为它不完整,所以JSON.parse为它抛出了错误
response.on('end', function() {
  try {
    var responseString = Buffer.concat(responseBuffer).toString('utf8');
    resolve(JSON.parse(responseString));
  } catch(ex) {
    reject(ex);
  }
});
response.on('data', function(str) {
  responseString += str;
});