Node express:查询执行后无法访问数据

3

我有一个简单的自定义模块,所有方法都应该返回数据库记录。

运行查询后,我获取了所有记录,但当我尝试将这些记录分配给一些变量时,它会显示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());

所有的内容都是空或者为null。请指导或建议。我有什么遗漏吗?
2个回答

1
欢迎来到异步函数的世界,我的朋友。 在你的代码中,console.log('my posts' + posts);return posts; 的执行在回调函数为 posts 变量赋值之前完成。 此外,限制自己不使用 var,而是使用 let 来声明变量,在作用域函数中工作时无错误。 以下是示例:
  • async 关键字声明函数是异步的。
  • await 关键字基本上说,让我们先获取结果,然后再移动到下一个语句/行。所有 await 应该只在 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(我个人的选择)来处理它们。

顺便问一下,这是路由器吗? 响应去哪了? - Atish Shakya
请检查更新后的答案并回复我是否有效。 - Atish Shakya
你是指什么意思?.php文件? - Atish Shakya
postModel.all().then(data =>{ console.log(data); });你能试试这个并给我反馈吗? - Atish Shakya
让我们在聊天中继续这个讨论 - Peter
显示剩余2条评论

1
尝试使用async和await,最佳实践是在try catch中包装代码,任何未决的promise都将在.then方法中解析,或者任何错误都将在调用方/最终函数的.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;

@sarinivas,感谢您的回复。我正在使用module.exports,其中我有一些函数/属性列表,就像您所看到的那样。我该如何在module export中添加回调函数getDataFromDB?或者有更好的方法吗?请指教。 - Peter
让我来检查一下。 - Peter
我建议使用async/await,因为在JavaScript中,如果您需要进行同步操作,最好使用它。而且看起来您的代码只是针对单个文件的,如果您真的需要在此处实现回调,"console.log("admin.js :" + postModel.all());" ---> 尝试这样做:function getData(cb) {postModel.all((err, docs) => {if (err) {return cb(null, null);} else {return cb(null, docs);}})} - whoami - fakeFaceTrueSoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接