我正在获取一个返回json的API,但是当它有错误时,它仅返回文本(在具有express的节点中,结果返回.json({})
,错误返回.send('string')
),但是我无法修改API
因此,我正在尝试制作可读取json的内容,但是如果它是文本,它将进入.catch
,其中错误是文本。
这是我尝试过的,但没有成功。
fetch(apiUrl)
.then(res => {
try {
let json = res.json()
return json
} catch (error) {
return new Promise((resolve, reject) => reject(res.text()))
}
})
.then(res => {
// get result from res.json() **res == res.json**
})
.catch(error => {
// get result from res.text() **res == res.text**
})
我该如何实现?如何在下一个res.json()
中获取.then()
,但如果失败,如何在res.text()
中获取.catch
?
我希望能够在.text
中获得.catch
。我不知道为什么,但是扔res.text()
不起作用。
答案 0 :(得分:1)
理想情况下,您的客户端应用程序应该知道期望的响应类型,并具有调用适当方法的静态代码。
处理您的情况的另一种方法是检查响应(e => e.MyDateTimeData == DateTime.Now)
并根据特定的响应标头值调用WHERE [e].[MyDateTimeData] = GETDATE()
或contentType
。
.json()
用法:
.text()
答案 1 :(得分:0)
另一种方法是先简单地将eveyrthing格式化为文本,然后再尝试对其进行解析,同时在解析问题时抛出错误。
fetch("http://maps.googleapis.com/maps/api/geocode/json?address=google")
.then(res => res.text())
.then(body => {
try {
return JSON.parse(body);
} catch {
throw Error(body);
}
})
.then(console.log)
.catch(console.error);
fetch("http://maps.googleapis.com/maps/api/geocode/xml?address=google")
.then(res => res.text())
.then(body => {
try {
return JSON.parse(body);
} catch {
throw Error(body);
}
})
.then(console.log)
.catch(console.error);