我使用 micro 创建了一个小 api。
运行localhost:3000/get-status
应该返回数据对象。
到目前为止,console.log() 正在打印预期的对象。
但是在浏览器上我收到未找到端点
,在服务器上我收到错误Si7021重置失败:错误[ERR_HTTP_HEADERS_SENT]:在将 header 发送到客户端后无法设置 header
我的 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)
)
最佳答案
看起来你的处理程序返回了一个立即解决的 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
处理程序中发送一些内容。
另外,请注意, promise 返回自
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);
}
}
关于javascript - 如何正确使用嵌套异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52699390/