javascript - 在我的 Express Controller 中进行 axios 调用,如何返回状态?

标签 javascript node.js typescript express error-handling

我不确定我是否设置了快速 Controller 以正确返回正确的响应。当端点被击中时,我想用 axios 调用地址服务并返回数据,或者如果出错则返回响应。不过目前如果找不到则返回默认错误400,但响应状态仍为200。

这里是否有我缺少的默认方法,或者这部分是正确的吗?

Controller

const getAddressWithPostcode = async (params: Params) => {
  const { postCode, number } = params

  const addressUrl = `${URL}/${postCode}${number
    ? `/${number}?api-key=${API_KEY}`
    : `?api-key=${API_KEY}`}`

  try {
    const { data } = await axios.get(addressUrl)
    return data
  } catch (e) {
    // throw e
    const { response: { status, statusText } } = e
    return {
      service: 'Address service error',
      status,
      statusText,
    }
  }
}

const findAddress = async (req: Request<Params>, res: Response, next: NextFunction) => {
  const { params } = req

  await getAddressWithPostcode(params)
    .then((data) => {
      res.send(data).status(200)
    })
    .catch((e) => {
      console.log('e', e)
      next(e)
    })
}

如果我发送一个狡猾的请求(使用 postman ),我会得到响应状态 200,但返回的数据是具有状态和文本的对象。我想将此作为我的默认响应,而不是返回具有这些属性的对象。 (见下图)。

enter image description here

这里只是一些指导会很好,可能是在express中使用异步等待并在内部使用外部axios调用时返回错误的最佳实践。

... ...

更新:

将我的代码更新为此,为了响应答案,我稍微重构了我的代码。

const getAddressWithPostcode = async (params: Params) => {
  const { postCode, number } = params

  const addressUrl = `${URL}/${postCode}${number
    ? `/${number}?api-keey=${API_KEY}`
    : `?api-key=${API_KEY}`}`

  try {
    const { data } = await axios.get(addressUrl)
    return data
  } catch (e) {
    // throw e
    const { response } = e
    return response
  }

}

const findAddress = async (req: Request<Params>, res: Response, next: NextFunction) => {
  const { params } = req

  await getAddressWithPostcode(params)
    .then((data) => {
      console.log('data', data)
      if (data.status !== 200) res.sendStatus(data.status)
      else {
        res.send(data)
      }
    })
    .catch(err => {
      console.log('err', err)
      next(err)
    })
}

最佳答案

如果您想发送与从 axios 调用获得的相同的 http 响应代码,只需更改 Controller 中的以下一行代码即可。

// Every time send same http status code 200
res.send(data).status(200)

// Send same http status code as returned by axios request
res.send(data).status(data.status)

关于javascript - 在我的 Express Controller 中进行 axios 调用,如何返回状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68345860/

相关文章:

node.js - 无法在 Koa2 中找到路由,面临错误 TypeError : route. paths is not a function

javascript - Angular 对象数组值抛出未定义错误

typescript - 在 angular2 中实现 addClass 和 removeClass 功能

node.js - 如果nodejs中不需要执行任何操作,跳过调用回调是否安全

typescript - 修复在 createTheme 中自定义 MuiDataGrid 时的 Typescript 错误

javascript - JS 帮助有选择地将 html 转义到预览区域

javascript - Tableau HTML 嵌入在 Chrome 中不起作用

javascript - 使用 jQuery 将数据发布到 MVC 操作方法

javascript - 教育用途的 CoffeeScript 与纯 JavaScript

node.js - 未找到清晰度 Angular (404 错误)