Javascript 从模型传递到控制器的查询响应值?
我正在用mysql数据库构建一个NodeJS服务器。我正在从数据库获得正确的响应,但是我的模型没有正确地将响应发送到我的控制器,或者我的控制器没有等待异步函数完成。控制器文件中的响应返回为未定义。这是我的密码: 型号: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;
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);
}
});
});
}
}