我正在尝试实施Nodejs project in MVC pattern
。
我的项目文件夹结构是:
我的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的结果行无法进入控制器。是什么解决了这个问题?
答案 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
})
}