Я пишу API, чтобы получить сотрудника по идентификатору, но проблема, с которой я сталкиваюсь, заключается в том, что контроллер вызывает другую функцию в службе и передает параметр и обратный вызов этой функции. Но когда функция вызывает обратный вызов, я получаю сообщение об ошибке. Код ниже. Я просмотрел онлайн-примеры и попытался устранить неполадки, но потерпел неудачу. У меня есть аналогичная настройка для метода getall, у которого нет параметра, и, похоже, он работает нормально. Код ниже.
Код контроллера есть.
function getById(req, res, next) {
userService.getById(req.params.id, (results) => {
res.json(results);
})
.catch(err => next(err));
}
Сервисный код есть.
async function getById(id, callback) {database.query('SELECT * FROM employee WHERE id =' +id, (err, results) => {
if (err) {
callback(err);
} else
callback(results);
});
}
Ошибка, которую я получаю:
TypeError: callback is not a function
at Query.database.query (/user.service.js:52:7)
at Query.<anonymous> (/Connection.js:525:10)
at Query._callback (/Connection.js:491:16)
at Query.Sequence.end (/Sequence.js:83:24)
at Query.ErrorPacket (/Query.js:90:8)
at Protocol._parsePacket (/Protocol.js:291:23)
at Parser._parsePacket (/Parser.js:433:10)
at Parser.write (/Parser.js:43:10)
at Protocol.write (/Protocol.js:38:16)
at Socket.<anonymous> (/Connection.js:91:28)
at Socket.<anonymous> (/Connection.js:525:10)
at Socket.emit (events.js:182:13)
at addChunk (_stream_readable.js:283:12)
at readableAddChunk (_stream_readable.js:264:11)
at Socket.Readable.push (_stream_readable.js:219:10)
at TCP.onread (net.js:639:20)
Можете ли вы привести пример наилучшего подхода
Вы смешиваете понятия:
function getById(req, res, next) {
UserService.getById(id)
.then(res => console.info(res))
.catch(err => console.error(err))
}
function getById(id) {
return new Promise((resolve, reject) => {
database.query('SELECT * FROM employee WHERE id =' + id, (err, results) => {
if (err)
reject(err)
resolve(results)
});
})
}
это работает, но по какой-то причине, когда я помещаю console.info(id) перед обещанием возврата, он регистрируется дважды: один раз undefined, второй раз с параметром url. это приводит к его сбою. Вы хоть представляете, почему это происходит?
Вы запутались, смешивая подход обещания и подход обратного вызова. Используйте тот или иной... обещание чище