为什么我无法从节点js项目中的模型到控制器获得返回值?

时间:2018-03-06 21:13:36

标签: mysql node.js express model-view-controller

我正在尝试实施Nodejs project in MVC pattern

我的项目文件夹结构是:

enter image description here
我的controller userController.js看起来像:

var usersModel = require('../models/users');

module.exports.list=function(req,res){
    var rows = usersModel.getAll();
    console.log(rows);
    res.render('index',{
        title:"Customers - Node.js",
        data:rows
    });
}

我的model users.js就像:

var connection = require('../config');    
module.exports = {
    getAll: function() {
        connection.query('SELECT * FROM users', function (err, rows) {
            console.log(rows); // its showing the records in cmd
            if (err) 
                console.log("Error in Query:", err);
            else 
                return rows;
        })
    }
};

Route文件:

var express = require('express');
var router = express.Router();

var userController = require('../controllers/userController');

/* GET home page. */
router.get('/', userController.list);

module.exports = router;

这里,模型方法i的结果行无法进入控制器。是什么解决了这个问题?

1 个答案:

答案 0 :(得分:1)

connection.query(...)是异步的,因此在从数据库中检索值之前调用res.render()。您应该查看promises,回调函数或异步等待以处理这些情况。您将在节点中经常使用它们。

例如,要在getAll函数中返回一个promise:

getAll: function() {
    return new Promise(function(resolve, reject) {
        connection.query('SELECT * FROM users', function (err, rows) {
            console.log(rows); // its showing the records in cmd
            if (err) 
                reject(err)
            else 
                resolve(rows);
        })
    })
}

并修改控制器的返回值:

function(req,res) {
    usersModel.getAll()
        .then(function(rows) {
            console.log(rows);
            res.render('index',{
                title:"Customers - Node.js",
                data:rows
            });
        })
        .catch(function(error) {
            // Handle error here
        })
}