sequelize.js - 按id和返回结果查找

Vov*_*zov 15 node.js sequelize.js

我有一个功能,

var findUserDevice = function(userDeviceId){

    var device = db.DeviceUser.find({
        where: {
            id: userDeviceId
        }
    }).then(function(device) {
        if (!device) {
            return 'not find';
        }
        return device.dataValues;
    });
};
Run Code Online (Sandbox Code Playgroud)

但是这个功能不会返回任何东西......

var UserDevice = findUserDevice(req.body.deviceUserId);
console.log(UserDevice);// undefined
Run Code Online (Sandbox Code Playgroud)

dri*_*hev 13

您尝试执行的操作是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;
     });
};
Run Code Online (Sandbox Code Playgroud)

后来使用它像:

findUserDevice(req.body.deviceUserId).then( function(UserDevice) {
   console.log(UserDevice);
}); 
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ong 8

这是2020年,asyncawait正在变得越来越受欢迎。您可以将代码更改为:

const findUserDevice = async function (userDeviceId) {
  const device = await db.DeviceUser.findOne({
    where: {
      id: userDeviceId
    }
  });
  if (device === null) {
    return 'device not found';
  }
  return device.dataValues;
};

 (async () => {
    // ...
    const UserDevice = await findUserDevice(req.body.deviceUserId);
    console.log(UserDevice);
    // ...
  })()
Run Code Online (Sandbox Code Playgroud)

恕我直言,上面的代码更具可读性。


yoo*_*eks 6

如果您在控制台上未定义而不是"未找到",则表示您的函数正在返回一个值.问题可能是dataValues实际上是未定义的.你需要检查的内容device.

提示:尝试返回device或者device.id

PS.如果你想基于id进行搜索,应该去findById()你的模型的功能.

var device = db.DeviceUser.findById(userDeviceId).then(function(device) {
  if (!device) {
    return 'not find';
  }
  return device.dataValues;
});
Run Code Online (Sandbox Code Playgroud)