我有一个简单的自定义模块,其中所有方法都应返回数据库记录。
运行查询后,我将获得所有记录,但是当我尝试将这些记录分配给某个变量时,它将显示null
。不知道发生了什么。
这是我的自定义模块代码:
module.exports = {
mydata: {},
all: function (req, res, next) {
var posts = null;
con.query("SELECT post_id,title, body from `posts`", function (err, rows, fileds) {
if (err) {
console.log('Error' + err);
}
posts = rows[0]; // assigned object object to posts but not working
console.log('names' + posts);
});
console.log('my posts' + posts); // it says null/empty
return posts; // empty return
},
我正在路由中调用所有这样的方法:
console.log("admin.js :" + postModel.all());
全部为空或为空。请指导或建议。我想念什么吗?
答案 0 :(得分:1)
欢迎我的朋友进入异步功能领域。
在您的代码中,console.log('my posts' + posts);
和return posts;
在回调将值分配给 posts 变量之前执行。
还限制自己不要使用 var 并使用 let 来声明变量更好地工作,而不会对作用域函数造成错误。
在下面,
async 关键字声明该函数是异步的
await 关键字基本上是说首先获取结果,然后转到下一条语句/行
所有awaits
应该只在async
函数内部完成。
module.exports = {
mydata: {},
all: async function (req, res, next) { //Let this be an asynchronous function
try{
let [rows, fields] = await con.query("SELECT post_id,title, body from `posts`");
//let us await for the query result so stay here until there is result
let posts = rows[0]; // assign first value of row to posts variable now
console.log('my posts' + posts);
return posts;
}catch(err){
return err;
}
},
}
请花点时间阅读Javascript中异步,非阻塞的性质以及如何通过Promises或Async / await(我个人选择)来处理它们。
答案 1 :(得分:0)
尝试使用async&await,再加上最好的做法是将代码包装在try catch中,任何待处理的promise将在.then方法中解决,或者任何错误都将在调用方/ final函数的.catch中捕获:>
/ *处理程序(或)服务(或)* /
const FetchDataFromDB = require('../');
/* caller Function */
let fetchDataFromDB = new FetchDataFromDB();
fetchDataFromDB.getDataFromDB()
.then((res) => console.log(res))
.catch((err) => console.log(err))
/ *数据库层* /
class FetchDataFromDB {
/* Method to get data from DB */
async getDataFromDB() {
const getQuery = "SELECT post_id,title, body from `posts`";
try {
let dbResp = await con.query(getQuery);
if (dbResp.length) {
//Do some logic on dbResp
}
return dbResp;
} catch (error) {
throw (error);
}
}
}
module.exports = FetchDataFromDB;