Node.js 使用NodeJS中的promiss从两个不同的SQL查询向EJS视图传递两个对象
我正在尝试构建一个包含三个字段的EJS表单,我需要同时向它传递两组数据:用户和使用承诺的书籍。不幸的是,书籍并没有通过考试,而且“未定义”。我不明白为什么 表格Node.js 使用NodeJS中的promiss从两个不同的SQL查询向EJS视图传递两个对象,node.js,express,promise,ejs,Node.js,Express,Promise,Ejs,我正在尝试构建一个包含三个字段的EJS表单,我需要同时向它传递两组数据:用户和使用承诺的书籍。不幸的是,书籍并没有通过考试,而且“未定义”。我不明白为什么 表格 Textfield(与本例无关) 带有用户列表的下拉框 带有书籍列表的下拉框 对于(2)和(3),我查询我的mysql数据库以获取数据,以便填写表单下拉框 /controller.js const User = require('../models/user.js'); const Book = require(
const User = require('../models/user.js');
const Book = require('../models/book.js');
exports.getAddNeueAusleihe = (req, res, next) => {
// storing users and books in this object
let view_data_for_my_view = {};
// fetch users for dropdown-box nr.1
User.fetchAll()
.then(([users_rows]) => {
view_data.users = users_rows;
// fetch books for dropdown-box nr. 2
return Book.fetchAll(([books_rows]) => {
view_data.books = books_rows;
});
})
.then(() => {
// send data to view
res.render('neue-ausleihe.ejs', {
users: view_data.users,
books: view_data.books,
pageTitle: 'Neue Ausleihe'
});
});
}
const db = require('../util/database.js');
module.exports = class User {
constructor(id, name) {
this.id = id;
this.name = name;
}
static fetchAll() {
return db.execute('SELECT * from dbuser WHERE UserFlag = "active"');
};
}
const db = require('../util/database.js');
module.exports = class Book {
constructor(id, name) {
this.id = id;
this.name = name;
}
static fetchAll() {
return db.execute('SELECT * from books WHERE status = "free"');
}
}
用户获取工作正常。但是Book fetch确实返回“undefined”,尽管books模型中的SQL代码工作正常。它实际上跳转到books模型中,但不会将值添加到视图中。这是我的模型SQL代码
/models/user.js
const User = require('../models/user.js');
const Book = require('../models/book.js');
exports.getAddNeueAusleihe = (req, res, next) => {
// storing users and books in this object
let view_data_for_my_view = {};
// fetch users for dropdown-box nr.1
User.fetchAll()
.then(([users_rows]) => {
view_data.users = users_rows;
// fetch books for dropdown-box nr. 2
return Book.fetchAll(([books_rows]) => {
view_data.books = books_rows;
});
})
.then(() => {
// send data to view
res.render('neue-ausleihe.ejs', {
users: view_data.users,
books: view_data.books,
pageTitle: 'Neue Ausleihe'
});
});
}
const db = require('../util/database.js');
module.exports = class User {
constructor(id, name) {
this.id = id;
this.name = name;
}
static fetchAll() {
return db.execute('SELECT * from dbuser WHERE UserFlag = "active"');
};
}
const db = require('../util/database.js');
module.exports = class Book {
constructor(id, name) {
this.id = id;
this.name = name;
}
static fetchAll() {
return db.execute('SELECT * from books WHERE status = "free"');
}
}
/models/books.js
const User = require('../models/user.js');
const Book = require('../models/book.js');
exports.getAddNeueAusleihe = (req, res, next) => {
// storing users and books in this object
let view_data_for_my_view = {};
// fetch users for dropdown-box nr.1
User.fetchAll()
.then(([users_rows]) => {
view_data.users = users_rows;
// fetch books for dropdown-box nr. 2
return Book.fetchAll(([books_rows]) => {
view_data.books = books_rows;
});
})
.then(() => {
// send data to view
res.render('neue-ausleihe.ejs', {
users: view_data.users,
books: view_data.books,
pageTitle: 'Neue Ausleihe'
});
});
}
const db = require('../util/database.js');
module.exports = class User {
constructor(id, name) {
this.id = id;
this.name = name;
}
static fetchAll() {
return db.execute('SELECT * from dbuser WHERE UserFlag = "active"');
};
}
const db = require('../util/database.js');
module.exports = class Book {
constructor(id, name) {
this.id = id;
this.name = name;
}
static fetchAll() {
return db.execute('SELECT * from books WHERE status = "free"');
}
}
假设
db.execute
返回解析为数组的承诺,其中第一个条目是实际结果,那么您的代码应该如下所示:
exports.getAddNeueAusleihe = (req, res, next) => {
// storing users and books in this object
const view_data = {};
// fetch users for dropdown-box nr.1
User.fetchAll()
.then(([users_rows]) => {
view_data.users = users_rows;
// fetch books for dropdown-box nr. 2
return Book.fetchAll();
})
.then([book_rows] => {
view_data.books = books_rows;
})
.then(() => {
// send data to view
res.render('neue-ausleihe.ejs', {
users: view_data.users,
books: view_data.books,
pageTitle: 'Neue Ausleihe'
});
});
}
奖励版本:
exports.getAddNeueAusleihe = async(req, res, next) =>
// send data to view
res.render('neue-ausleihe.ejs', {
pageTitle: 'Neue Ausleihe',
users: (await User.fetchAll())[0]
books: (await Book.fetchAll())[0]
});
}
即使是写这篇文章的人,我仍然不知道基于异步/等待的代码与承诺链相比可读性有多高。db.execute返回什么?顺便说一句,您不必在javascript中使用
static
。它不是Java。可以在类之外创建函数。奇怪的是,我在任何地方都看不到新书
,因为它的意图看起来像是代表书籍实体。这两个'db.execute'都返回正确的结果。对于用户来说,它基本上是“(用户id、用户名、userflag)”。对于书籍,它是“(书籍id、书籍名称、状态)”。还有一些属性,但它们对这个例子来说毫无意义。耶!成功了。我想知道,是否有一种方法可以解决这个问题,而不必构造“view\u data”对象?因为view_数据实际上变成了一个复合对象,它承载两种不同的数据类别——用户和书籍。是的,使用async您当然可以。我将更新“奖金版本”