没有得到npm请求包的全身

时间:2016-11-20 20:49:58

标签: json node.js request

我有以下函数返回获取数据的承诺。我正在使用request npm模块。

let getData = function (user) {

    return new Promise(function (resolve, reject) {

        let url = 'https://someurl.com/' + user;

        request(url, function (error, res, body) {
            if (error) reject(error);
            try{
                resolve(cleanData(JSON.parse(body).items))
            }catch(e){
                console.log(body)
                console.log(url)
                console.log(e);
            }
        })

    })
}

当我履行承诺时,我有时会得到这样的结论:

SyntaxError: Unexpected token u in JSON at position 0

当我的身体以未定义的方式返回时会发生这种情况。但有时候我也会得到这样的东西:

SyntaxError: Unexpected token f in JSON at position 11203

其他时候(大多数时候),它完美无缺。

我已经能够在调试时仔细检查这一点,似乎有时我会得到一个不完整的身体。我知道一个事实,来源url的身体并不完整。我通过直接使用我的浏览器访问URL并确保json完整且有效来检查这一点。

发生了什么事?据我所知,request函数的回调仅在响应准备好被消耗时才被调用。

2 个答案:

答案 0 :(得分:1)

不 - 一旦有响应就会触发回调 - 请参阅 HTTP request API documentation。您需要将响应侦听器实现为:

res.on('data', (chunk) => {
    // do the data accumulation here
  });
  res.on('end', () => {
    // do the resolve here
  });

答案 1 :(得分:0)

如果您希望来自回复的request module数据,请binaryencoding: null中,然后在请求选项中设置a = '''MS17010314 MS00030208 IL00171198 IH09850115 IH99400409 IH99410409 IL01771010 IL01791002 IL01930907 IL02360907 CM00010904 IH09520115 MS00201285 MS19050708 MS00370489 MS19011285T''' import re patterns = ['[A-Z]{2}[0-9]{8,9}[A-Z]{1}','[A-Z]{2}[0-9]{8,9}'] pattern = '({})'.format(')|('.join(patterns)) matches = re.findall(pattern, a) print([match for sub in matches for match in sub if match]) #['MS17010314', 'MS00030208', 'IL00171198', 'IH09850115', 'IH99400409', # 'IH99410409', 'IL01771010', 'IL01791002', 'IL01930907', 'IL02360907', # 'CM00010904', 'IH09520115', 'MS00201285', 'MS19050708', 'MS00370489', # 'MS19011285T']

摘自:

  

encoding - 用于响应数据的setEncoding的编码。如果为null,则将主体作为Buffer返回。其他任何东西(包括默认值undefined)将作为encoding参数传递给toString()(这意味着默认情况下这实际上是utf8)。 (注意:如果您需要二进制数据,则应设置encoding:null。)

https://www.npmjs.com/package/request