当从一台服务器向另一台服务器发出 http 请求时,Catch 回调运行而不是 then callback
Catch callback runs instead of then callback when making a http request from one server to another
我正在使用 node-fetch 从一个 API 调用另一个 API,但是当 "API 2" 发生错误时,成功回调 运行s .
我不确定这是否是有意为之的行为,以及您是否应该检查状态代码的响应而不是使用 catch
回调 运行.
API 1:
fetch('http://localhost:4060/api/passwords', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
userId: doc._id,
hash: hash
})
})
.then((response) => {
console.log(response);
return res.json(doc);
})
.catch((e) => {
console.log('ERROR')
next(e);
});
API 2:
app.use((err, req, res, next) => {
res.status(err.status).json({
message: err.isPublic ? err.message : httpStatus[err.status],
stack: config.env === 'development' ? err.stack : {}
});
});
当 "API 2" 中出现错误时,响应如下所示:
Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]:
{ body:
PassThrough {
_readableState: [Object],
readable: true,
domain: null,
_events: [Object],
_eventsCount: 3,
_maxListeners: undefined,
_writableState: [Object],
writable: false,
allowHalfOpen: true,
_transformState: [Object] },
disturbed: false,
error: null },
[Symbol(Response internals)]:
{ url: 'http://localhost:4060/api/passwords',
status: 400,
statusText: 'Bad Request',
headers: Headers { [Symbol(map)]: [Object] },
counter: 0 } }
如您所见,出现了一个错误,来自 API 2 运行 的代码段返回了带有 400
状态代码的错误。
如上所述,这是有意为之的行为吗?我的印象是 catch
应该 运行 而不是 then
,有什么办法可以调整我的代码来实现这一点吗?
catch
适用于您的代码有错误或某些东西阻止了您的代码 executing/fulfilling。在 fetch
的情况下,这些情况将是端口阻塞、网络故障、服务器重置连接或任何无法完成您的请求的情况。服务器返回 400 不是代码错误。请求已完成。给出了回应。您只是没有得到您期望的数据。逻辑错误。
因此您必须手动检查代码中的 400/500 错误。
打个比方,假设您正在尝试通过 fs.readFile('test.json',(err,data) => console.log(data))
读取文件。如果数据为空,则不是错误。代码读取了文件,没有什么可报告的。如果数据出现乱码,则不是错误。可能是编码问题,您没有正确解析内容。错误可能是文件被另一个进程锁定、权限被拒绝、文件不存在等。
我正在使用 node-fetch 从一个 API 调用另一个 API,但是当 "API 2" 发生错误时,成功回调 运行s .
我不确定这是否是有意为之的行为,以及您是否应该检查状态代码的响应而不是使用 catch
回调 运行.
API 1:
fetch('http://localhost:4060/api/passwords', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
userId: doc._id,
hash: hash
})
})
.then((response) => {
console.log(response);
return res.json(doc);
})
.catch((e) => {
console.log('ERROR')
next(e);
});
API 2:
app.use((err, req, res, next) => {
res.status(err.status).json({
message: err.isPublic ? err.message : httpStatus[err.status],
stack: config.env === 'development' ? err.stack : {}
});
});
当 "API 2" 中出现错误时,响应如下所示:
Response {
size: 0,
timeout: 0,
[Symbol(Body internals)]:
{ body:
PassThrough {
_readableState: [Object],
readable: true,
domain: null,
_events: [Object],
_eventsCount: 3,
_maxListeners: undefined,
_writableState: [Object],
writable: false,
allowHalfOpen: true,
_transformState: [Object] },
disturbed: false,
error: null },
[Symbol(Response internals)]:
{ url: 'http://localhost:4060/api/passwords',
status: 400,
statusText: 'Bad Request',
headers: Headers { [Symbol(map)]: [Object] },
counter: 0 } }
如您所见,出现了一个错误,来自 API 2 运行 的代码段返回了带有 400
状态代码的错误。
如上所述,这是有意为之的行为吗?我的印象是 catch
应该 运行 而不是 then
,有什么办法可以调整我的代码来实现这一点吗?
catch
适用于您的代码有错误或某些东西阻止了您的代码 executing/fulfilling。在 fetch
的情况下,这些情况将是端口阻塞、网络故障、服务器重置连接或任何无法完成您的请求的情况。服务器返回 400 不是代码错误。请求已完成。给出了回应。您只是没有得到您期望的数据。逻辑错误。
因此您必须手动检查代码中的 400/500 错误。
打个比方,假设您正在尝试通过 fs.readFile('test.json',(err,data) => console.log(data))
读取文件。如果数据为空,则不是错误。代码读取了文件,没有什么可报告的。如果数据出现乱码,则不是错误。可能是编码问题,您没有正确解析内容。错误可能是文件被另一个进程锁定、权限被拒绝、文件不存在等。