0

我正在使用node-fetch从一个 API 调用另一个 API,但是当“API 2”中发生错误时,成功回调运行。

我不确定这是否是预期的行为,以及您是否应该检查状态代码的响应而不是让catch回调运行。

接口 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,有什么办法可以调整我的代码以实现这一点?

4

1 回答 1

2

catch适用于当您的代码有错误或某些事情阻止您的代码执行/完成时。在fetch这些情况下,端口被阻塞、网络故障、服务器重置连接或任何无法完成您的请求的事情。返回 400 的服务器不是代码错误。请求已完成。给出了回应。你只是没有得到你期望的数据。这是一个逻辑错误。

因此,您必须手动检查代码中的 400/500 错误。

打个比方,假设您正试图通过fs.readFile('test.json',(err,data) => console.log(data)). 如果数据为空,则不是错误。代码读取了文件,没有什么可报告的。如果数据出现乱码,则不是错误。也许这是一个编码问题,您正在错误地解析内容。错误可能是文件被另一个进程锁定,权限被拒绝,文件不存在等。

于 2019-06-06T15:34:05.240 回答