Sequelize.js - Найти по id и вернуть результат
У меня есть функция,
var findUserDevice = function(userDeviceId){
var device = db.DeviceUser.find({
where: {
id: userDeviceId
}
}).then(function(device) {
if (!device) {
return 'not find';
}
return device.dataValues;
});
};
но эта функция ничего не возвращает...
var UserDevice = findUserDevice(req.body.deviceUserId);
console.log(UserDevice);// undefined
Ответы
Ответ 1
Операция, которую вы пытаетесь сделать, это async
, что означает, что вам нужно использовать обратный вызов. Поскольку sequelize
создается поверх Promises, вы должны написать свой код следующим образом:
var findUserDevice = function(userDeviceId){
// return the promise itself
return db.DeviceUser.find({
where: {
id: userDeviceId
}
}).then(function(device) {
if (!device) {
return 'not find';
}
return device.dataValues;
});
};
И позже используйте его как:
findUserDevice(req.body.deviceUserId).then( function(UserDevice) {
console.log(UserDevice);
});
Ответ 2
Если вы получаете undefined вместо "не найти" на консоли, это означает, что ваша функция возвращает значение. Проблема может быть dataValues на самом деле undefined. Вам нужно проверить содержимое device
.
Подсказка: попробуйте вернуться только device
или device.id
PS. Если вы хотите выполнить поиск на основе id, следует перейти к функции findById()
вашей модели.
var device = db.DeviceUser.findById(userDeviceId).then(function(device) {
if (!device) {
return 'not find';
}
return device.dataValues;
});
Ответ 3
Это 2019, async
& await
становится все более популярным. Вы можете изменить свой код на
const findUserDevice = async function (userDeviceId) {
const device = await db.DeviceUser.find({
where: {
id: userDeviceId
}
})
if (!device) {
return 'not find'
}
return device.dataValues
}
;(async () => {
// ...
const UserDevice = await findUserDevice(req.body.deviceUserId)
console.log(UserDevice)
// ...
})()
ИМХО, приведенный выше код более читабелен.
Ответ 4
Эта функция получила params id, этот рабочий для меня:
const { customer } = require('../models');
const get = async function(req, res){
let id = req.params.id;
[err, singleCustomer] = await to(customer.findByPk(id, { raw : true }));
return ReS(res, { message :'Obtener cliente: : ', data : JSON.stringify(singleCustomer) });
}
Ответ 5
Чтобы получить нужные данные в экспрессе, я использовал findOne, чтобы получить желаемый результат.
router.get('/api/canidates/get-canidates-by-cnic/:cnic', (req, res) => {
models.canidate.findOne({
where: {
cnic: [req.params.cnic]
}
}).then(canidate => {
return res.status(200).json({success: true, data: canidate})
})});