Как правильно использовать вложенный асинхронный код? - PullRequest
0 голосов
/ 08 октября 2018

Я создал небольшой 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() функция?Думаю, я кое-что перепутал с обещаниями и асинхронными вещами.И, может быть, я вложил функции без необходимости ...

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)
)

1 Ответ

0 голосов
/ 08 октября 2018

Похоже, ваш обработчик возвращает обещание, которое разрешается немедленно.Можете ли вы попытаться переписать последнюю строку следующим образом?

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}`)
  }
}

Но вы, вероятно, захотите что-то отправить в *Также обработчик 1007 *.

Кроме того, учтите, что обещание, возвращенное с

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);
  }
}
...