如何使用fetch处理响应.json和.text?

时间:2019-05-20 19:53:00

标签: javascript fetch es6-promise

我正在获取一个返回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()不起作用。

2 个答案:

答案 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);