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