Node.js 从多个回调访问数据
我正在开发一个Express nodeJS web应用程序,并试图增加我对异步编程以及如何正确访问所需数据的知识 我有两个查询SQL数据库的回调函数。我的函数声明如下:Node.js 从多个回调访问数据,node.js,express,asynchronous,Node.js,Express,Asynchronous,我正在开发一个Express nodeJS web应用程序,并试图增加我对异步编程以及如何正确访问所需数据的知识 我有两个查询SQL数据库的回调函数。我的函数声明如下: function CustomerList(callback) { const db = require('../db'); db.query('SELECT * FROM users WHERE role = (?)', ['User'], (error, results, fields) => { if
function CustomerList(callback) {
const db = require('../db');
db.query('SELECT * FROM users WHERE role = (?)', ['User'], (error, results, fields) => {
if (error) throw error;
callback(results);
});
}
function AdminList(callback) {
const db = require('../db');
db.query('SELECT * FROM admins WHERE role = (?)', ['Moderator'], (error, results, fields) => {
if (error) throw error;
callback(results);
});
}
我使用从两个回调中检索到的数据,并将其发送到我的视图引擎模板,以便在浏览器中显示,如下所示:
CustomerList((userData) => {
AdminList((adminData) => {
res.render('adminhome', {
title: 'Admin - Home',
results: 'test',
customers: userData,
admins: adminData
});
});
这与预期的一样,我可以在视图模板上随意操作数据。但是这似乎是……”“笨重”,我觉得如果我创建额外的函数来检索更多的数据,然后继续嵌套额外的回调以将数据传递到视图模板,那么我正在使用的这种方法将来会给我带来麻烦
本质上,我正在努力找到一种合适的方法来检索UserData结果和AdminData结果,并将它们传递给我的res.render API调用
有什么比我目前的方法更好的选择吗?是的,如果在回调中调用多个回调,它将创建回调地狱,请使用promisesasync/await
const util = require('util');
const db = require('../db');
const query = util.promisify(db.query);
const getData = async () => {
try {
const CustomerList = await query('SELECT * FROM users WHERE role = (?)', ['User']);
const AdminList = await query('SELECT * FROM admins WHERE role = (?)', ['Moderator']);
// OR Promise.all
const [CustomerList, AdminList] = await Promise.all([
query('SELECT * FROM users WHERE role = (?)', ['User']),
query('SELECT * FROM admins WHERE role = (?)', ['Moderator'])
]);
} catch (error) {
console.log(error);
}
}
使用Promise.all或杠杆async/await。这看起来确实是解决问题的方法,但是,我得到:TypeError:无法读取未定义的属性“typeCast”。我现在正在研究这个错误,但是有什么想法吗?在研究之后,我将我的db.js文件更改为使用connectionPool,而不仅仅是一个连接,这使您的代码片段能够完美地工作。谢谢!!: