Node.js 使用NodeJS中的promiss从两个不同的SQL查询向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(

我正在尝试构建一个包含三个字段的EJS表单,我需要同时向它传递两组数据:用户和使用承诺的书籍。不幸的是,书籍并没有通过考试,而且“未定义”。我不明白为什么

表格

  • Textfield(与本例无关)
  • 带有用户列表的下拉框
  • 带有书籍列表的下拉框
  • 对于(2)和(3),我查询我的mysql数据库以获取数据,以便填写表单下拉框

    /controller.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"');
           }
        }
    
    用户获取工作正常。但是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您当然可以。我将更新“奖金版本”