Sequelizejs-然后结果问题

时间:2019-04-18 20:10:00

标签: javascript node.js sequelize.js

我正在使用NodeJS和Sequelize。我有以下问题:

阅读设置表:

    Settings.findOne({where: {
        user_id: data
    }})
   .then(settings => {
    // Next request
   });

我需要将settings.device (Example)保存在.then块之外。 但是如果我这样做

var device;

Settings.findOne({where: {
      user_id: data
    }})
   .then(settings => {
      device = settings.device;
   });

它不起作用。

已经输出了错误undefined

.then结果块中带有console.log(settings.device);的输出效果很好。

更新

我需要它:

    var array = [];

    // Get Settings from table
    Settings.findOne({where: {
        user_id: data
    }})
    .then(settings => {

        // Get token from other Table
        Example.findOne({where: {
            user_id: data
        }})
        .then(example => {
            // push to array 
            array.push({
                "user_id" : data,
                "device":settings.device, // output: settings.device is undefined
                "token": example.token
            });

        });

    });

    // Send array to client

2 个答案:

答案 0 :(得分:1)

Sequelize返回可以通过dataValue获得值的模型对象

 console.log(settings.dataValues.device);

或者如果您想要精益数据

 Settings.findOne({where: {        
  user_id: data,
  raw:true,
    }})
   .then(settings => {
     device = settings.device;
     console.log(device);
   });

答案 1 :(得分:1)

这实际上是一个有关如何处理Promise链中多个已解析值的问题。您可以进行搜索,并看到许多有关如何处理它的出色示例。例如,您可以在每个then处理程序中返回一个数组或对象,或者将值重新分配给作用域更大的变量(与settings一样)。过去,我已经大量使用了这两种方法,因此生成的代码显然不够雅致,编写起来也不有趣。

然而,异步/等待在Node中很容易获得,并大大简化了代码:

const array = [];

// Get settings.
const settings = await Settings.findOne({where: {
    user_id: data
}});

// Get token.
const example = await Example.findOne({where: {
    user_id: data
}});

array.push({
    user_id : data,
    device: settings.device,
    token: example.token
});