节点快递:查询执行后无法访问数据

时间:2019-05-06 06:57:58

标签: javascript node.js express

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

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

全部为空或为空。请指导或建议。我想念什么吗?

2 个答案:

答案 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;