Javascript 从模型传递到控制器的查询响应值?

Javascript 从模型传递到控制器的查询响应值?,javascript,mysql,node.js,typescript,async-await,Javascript,Mysql,Node.js,Typescript,Async Await,我正在用mysql数据库构建一个NodeJS服务器。我正在从数据库获得正确的响应,但是我的模型没有正确地将响应发送到我的控制器,或者我的控制器没有等待异步函数完成。控制器文件中的响应返回为未定义。这是我的密码: 型号: const sqlDb = require('../../db/index.ts'); module.exports = { getNProducts: (page = 0, n = 5) => { let offset = page * n;

我正在用mysql数据库构建一个NodeJS服务器。我正在从数据库获得正确的响应,但是我的模型没有正确地将响应发送到我的控制器,或者我的控制器没有等待异步函数完成。控制器文件中的响应返回为未定义。这是我的密码:

型号:

const sqlDb = require('../../db/index.ts');

module.exports = {
  getNProducts: (page = 0, n = 5) => {
      let offset = page * n;
      if (offset > 0) {
        sqlDb.query(`SELECT * FROM Products ORDER BY id DESC LIMIT ${n}, ${offset}`, (err, res, feilds) => {
            if (err) {
                return;
            } else {
                return res;
            }
        });
        } else {
        sqlDb.query(`SELECT * FROM Products ORDER BY id DESC LIMIT ${n}`, (err, res, feilds) => {
            if (err) {
                console.log(err);
                return;
            } else {
                return res;
            };
          });
        }
  }
}
控制器:

 const productModel = require('../models/productModel.ts');
    
    module.exports = {
        getProducts: async(req, res) => {
          let response = await productModel.getNProducts();
          res.send(response).status(200);
        }
    }

productModel.ts
中,
getNProducts
函数不是异步函数,因此它不会返回承诺

我建议这样做,这是我见过的解释什么是异步等待的最清晰的方式

实际发生的是控制器中的<;br>
let response=wait productModel.getNProducts()

不等待解析承诺,因为
productModel.getNProducts()
不返回是一个异步函数(不返回承诺)

您可以编辑
getNProducts
使其看起来像这样

getNProducts: async (page = 0, n = 5) => { // now this return a promise
  let offset = page * n;
  if (offset > 0) {
   await sqlDb.query(`SELECT * FROM Products ORDER BY id DESC LIMIT ${n}, ${offset}`, (err, res, feilds) => {// and now you await for it here
        if (err) {
            return;
        } else {
            return res;
        }
    });
    } else {
   await sqlDb.query(`SELECT * FROM Products ORDER BY id DESC LIMIT ${n}`, (err, res, feilds) => { // and here too
        if (err) {
            console.log(err);
            return;
        } else {
            return res;
        };
      });
    }

}

productModel.ts
中,
getNProducts
函数不是异步函数,因此它不会返回承诺

我建议这样做,这是我见过的解释什么是异步等待的最清晰的方式

实际发生的是控制器中的<;br>
let response=wait productModel.getNProducts()

不等待解析承诺,因为
productModel.getNProducts()
不返回是一个异步函数(不返回承诺)

您可以编辑
getNProducts
使其看起来像这样

getNProducts: async (page = 0, n = 5) => { // now this return a promise
  let offset = page * n;
  if (offset > 0) {
   await sqlDb.query(`SELECT * FROM Products ORDER BY id DESC LIMIT ${n}, ${offset}`, (err, res, feilds) => {// and now you await for it here
        if (err) {
            return;
        } else {
            return res;
        }
    });
    } else {
   await sqlDb.query(`SELECT * FROM Products ORDER BY id DESC LIMIT ${n}`, (err, res, feilds) => { // and here too
        if (err) {
            console.log(err);
            return;
        } else {
            return res;
        };
      });
    }
}函数中的
sqlDb.query()
调用使用回调方法,实际上没有返回承诺。您可以尝试重写
getNProducts()
函数以返回这样的承诺

module.exports = {
  getNProducts: (page = 0, n = 5) => {
    const offset = page * n;
    const limitString = (offset > 0)  ? `LIMIT ${n}, ${offset}` : `LIMIT ${n}`;
    return new Promise((resolve, reject) => {
      sqlDb.query(`SELECT * FROM Products ORDER BY id DESC ${limitString}`, (err, res, feilds) => {
          if (err) {
              reject(err);
          } else {
              resolve(res);
          }
      });
    });
  }
}
sqlDb.query()
函数中的
getNProducts()
调用使用回调方法,实际上没有返回承诺。您可以尝试重写
getNProducts()
函数以返回这样的承诺

module.exports = {
  getNProducts: (page = 0, n = 5) => {
    const offset = page * n;
    const limitString = (offset > 0)  ? `LIMIT ${n}, ${offset}` : `LIMIT ${n}`;
    return new Promise((resolve, reject) => {
      sqlDb.query(`SELECT * FROM Products ORDER BY id DESC ${limitString}`, (err, res, feilds) => {
          if (err) {
              reject(err);
          } else {
              resolve(res);
          }
      });
    });
  }
}