我正在使用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
答案 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
});