我有以下函数返回获取数据的承诺。我正在使用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
函数的回调仅在响应准备好被消耗时才被调用。
答案 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
数据,请binary
在encoding: 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。)