Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从多个回调访问数据_Node.js_Express_Asynchronous - Fatal编程技术网

Node.js 从多个回调访问数据

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

我正在开发一个Express nodeJS web应用程序,并试图增加我对异步编程以及如何正确访问所需数据的知识

我有两个查询SQL数据库的回调函数。我的函数声明如下:

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,而不仅仅是一个连接,这使您的代码片段能够完美地工作。谢谢!!: