gpt4 book ai didi

node.js - 为什么在使用 sequelize 并传递给 ejs 之后,只有第一个对象有值而其他所有对象都显示为空?

转载 作者:搜寻专家 更新时间:2023-11-01 00:47:36 25 4
gpt4 key购买 nike

我正在尝试使用 node.js 中的 sequelize 从不同的表中提取数据并将数据保存在不同的对象中。问题是,当我将这些对象传递给 ejs 并尝试访问它们的属性时,这里的所有其他对象都是空的,只有一个除外。

var doctors, patient;
Consultant.findAll().then((data) => {
if (data) {
doctors = data;
} else {
console.log('No data found');
}
})
.then(() => {
Patient.findAll().then((data) => {
if (data) {
patient = data;
} else {
console.log('No data found');
}
});
})
.then(() => {
console.log(patient);
res.render('save', { user: req.user, consultants: doctors, patients: patient });
});

当我尝试在 ejs 中访问 consultants 对象的属性时,它显示一个空对象并且只有 patients 对象具有值 init。我不确定这里的问题是什么。

最佳答案

Sequelize 查询以异步(非阻塞)方式执行,这意味着执行不会等待 sequelize 查询完成,而是执行 res.render 语句,从而导致一些空对象传递到您的 ejs View 。

要解决您的问题,您必须在转到 res.render 语句之前强制完全执行 sequelize 查询。

Node Js 有 async 插件可以解决你的问题。你可以通过 npm 命令安装这个插件

 npm install -g async

安装此插件后,您必须将其导入到您的 js 文件中

const async = require('async');

现在您可以使用此插件的parallelseries 功能。 Parallel 函数以并行方式运行数组或对象中存在的所有函数。其中 series 函数等待第一个函数执行,然后在数组或对象中执行下一个函数。在您的情况下,在 parallelseries 中,您可以放置您的 Sequelize 查询。在执行完 parallelseries 函数(在你的例子中是所有 sequelize 查询)中的所有函数之后,最后一个函数调用,你可以在其中放置你的 res.render 语句。

这是可以解决你问题的代码

var Locals = {};

asynco.parallel([
(done) => {
Consultant.findAll().then(data => {
Locals.Consultant = data;
done();
});
},
(done) => {
Patient.findAll().then(data => {
Locals.Patient = data;
done();
});
}
], (err) => {

res.render('save', { user: req.user, consultants: Locals.Consultant, patients: Locals.Patient });
});

关于node.js - 为什么在使用 sequelize 并传递给 ejs 之后,只有第一个对象有值而其他所有对象都显示为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com