我有以下React Native客户端代码:
confirmMatchRecord(userId, matchedUserData['userId'], matchRecordData['matchRecord']['matchWinner'], matchRecordData['matchType'], currentUserRating, matchedUserRating, matchData['_id'], matchRecordData['matchRecord']['_id'], airbnbRatingValue, true, new Date())
.then((results) => {
// Do stuff
})
.catch((error) => {
Alert.alert('Error', 'There was an issue with confirming the record. Please check your connection and/or try again later.');
});
以及我的confirmMatchRecord
函数中的以下代码:
export async function confirmMatchRecord(userId, matchedUserId, matchWinner, matchType, currentUserRating, matchedUserRating, matchId, matchRecordId, matchRating, matchConfirmed, timestamp) {
console.log('Attempting to record match');
info = { userId, matchedUserId, matchWinner, matchType, currentUserRating, matchedUserRating, matchId, matchRecordId, matchRating, matchConfirmed, timestamp }
const firebaseIdToken = await AsyncStorage.getItem('@firebaseIdToken')
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + firebaseIdToken },
body: JSON.stringify(info)
};
const response = await fetch(ngrokOrLocalhost + '/confirmmatchrecord', requestOptions)
if (response['Status']==='Failure') {
// throw new Error(`HTTP error! status: ${response.status}`);
throw new Error(400);
} else if (response['Status']==='Success') {
const data = await response.json()
return data
}
}
服务器代码:
router.post('/confirmmatchrecord', async (req, res) => {
// Do a lot of stuff
if (response==='Success') {
return res.status(200).json({'Status': 'Success'})
} else {
return res.status(400).json({'Status': 'Failure'})
console.log('Match record was not confirmed successfully');
}
如您所见,当response ['Status'] ==='Failure(由服务器发送)失败时,它将引发错误400,我希望.catch
然后在客户端代码中触发该错误。但这不会发生,因为客户端代码继续在该.then
部分上运行。
我应该怎么做呢?不知道.catch
这里使用的方法是否正确,或者我是否应该以其他方式进行此类工作。
您似乎已经意识到fetch
API中的“步枪” (我在这里写到),fetch
只是在网络错误而不是HTTP错误上拒绝了它的承诺,但是您的检查在两种方面是不正确的:
是status
,而不是Status
(大写字母很重要),并且
这是HTTP代码(400
例如),而不是字符串
该Response
对象提供了一个方便的ok
标志,对于任何成功的响应都适用,false
否则,这样:
const response = await fetch(ngrokOrLocalhost + '/confirmmatchrecord', requestOptions)
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`); // This will be "HTTP error! status: 400" if the HTTP error code is 400
}
const data = await response.json();
return data;
在评论中,您说过:
我
response['Status']
正在检查发送的自定义服务器消息(res.status(400).json({'Status': 'Failure'})
,我用它更新了帖子。不确定为什么它没有捕获到该消息。
啊! 好的。它没有被捕获的原因是您正在Response
对象上寻找它,但是JSON在响应正文中。
我怀疑您Status
既然已经知道response.ok
并且response.status
现在就不想再使用自己的信息了,但是如果您确实想将自己的信息作为JSON包含在错误响应中,则可以这样做。您可以这样做:
const response = await fetch(ngrokOrLocalhost + '/confirmmatchrecord', requestOptions)
const data = await response.json(); // Expects JSON in *both* the success response and the error response
if (data.Status === "Failure") {
throw new Error(`HTTP error! status: ${response.status}`); // This will be "HTTP error! status: 400" if the HTTP error code is 400
}
return data;
但是我会坚持使用内置功能,ok
并且只status
提供成功/失败的纯信息。但是,如果您想提供更多有关失败的详细信息,这可能会很方便。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句