NodeJS 如何正确使用嵌套异步代码?

w1e3prcc  于 2023-04-05  发布在  Node.js
关注(0)|答案(1)|浏览(102)

我用micro创建了一个小的API。
运行localhost:3000/get-status应该返回数据对象。到目前为止,console.log()正在打印预期的对象。
但是在浏览器上我得到Endpoint not found,在服务器上我得到错误Si7021 reset failed: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
我的getStatus()函数有什么问题吗?我想我把promise和异步的东西弄混了。也许我不必要地嵌套了函数...

const { send } = require('micro')
const { router, get } = require('microrouter')
const Si7021 = require('si7021-sensor')

const getStatus = async (req, res) => {
  const si7021 = new Si7021({ i2cBusNo: 1 })
  const readSensorData = async () => {
    const data = await si7021.readSensorData()
    console.log(data)
    send(res, 201, { data })
  }

  si7021.reset()
    .then((result) => readSensorData())
    .catch((err) => console.error(`Si7021 reset failed: ${err} `))
}

const notFound = (req, res) => {
  console.log('NOT FOUND.')
  send(res, 404, 'Endpoint not found')
}

module.exports = router(
  get('/get-status', getStatus),
  get('/*', notFound)
)
2q5ifsrm

2q5ifsrm1#

看起来你的处理程序返回了一个立即解析的promise。你能试着像这样重写最后一行吗?

return si7021.reset()
    .then((result) => readSensorData())
    .catch((err) => console.error(`Si7021 reset failed: ${err}`));

它可以更简洁地写为:

const getStatus = async (req, res) => {
  try {
    const si7021 = new Si7021({ i2cBusNo: 1 });
    await si7021.reset();
    const data = await si7021.readSensorData();
    console.log(data);
    return send(res, 201, { data });
  } catch (e) {
    console.error(`Si7021 reset failed: ${err}`)
  }
}

但是您可能还希望在catch处理程序中发送一些内容。
还有,请注意,承诺从

si7021.reset()
    .then((result) => readSensorData());

不仅在.reset失败时拒绝。它还拒绝readSensorData失败。所以你的错误消息是不完整的。总而言之,我宁愿推荐一些东西:

const getStatus = async (req, res) => {
  try {
    const si7021 = new Si7021({ i2cBusNo: 1 });
    await si7021.reset();
    const data = await si7021.readSensorData();
    console.log(data);
    send(res, 201, { data });
  } catch (e) {
    console.error(`Si7021 failed: ${err.message}`);
    send(res, 500, err.message);
  }
}

相关问题