var express = require('express'),
router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
var db = require('../models/db');
db.once('open', function() {
console.log('mongoose opened!');
var userSchema = new mongoose.Schema({
title: {type: String, unique: true},
avatar: String,
category: String,
read: Number,
comment: Number,
content: String,
cover: String
},{collection: "articles"});
var Articles = mongoose.model('articles', userSchema);
Articles.find(function(err, doc){
if(err) console.log(err);
else console.log(doc);
//位置1 *************
// res.render('index', { title: 'hello world' });
});
});
//位置2 *************
res.render('index', { title: 'hello world' });
});
module.exports = router;
\n```
为什么我把 ' res.render('index', { title: 'hello world' });' 放到位置2是可以的,放到位置1却不行。
我需要放到位置1 才能用查询出来的结果去渲染页面啊。
少侠们帮帮忙,讲讲原因。
位置一在你的查找回调中,这是一个异步操作,等你的线程执行位置一的代码时,你的res不存在了。
你有两个方法解决这个问题, 第一就是把res,req做为参数传递到回调中。 第二就是把所有回调都写成闭包,将res,req传递到闭包中。
我是如此解决问题的 首先我写了一个dataSource的类,里面有一个方法是 dataSource.prototype.getConn = function() { var emitter = new events.EventEmitter();
this.pool.getConnection(function( err,conn ){
if( err ) {
return emitter.emit("error",err);
}
emitter.emit("success",conn);
});
return emitter;
}
Module类中是如此调用的 adminModule.prototype.login = function( uname,pwd ) { var emitter = new events.EventEmitter();
dataSource.getConn().on("success",function( conn ){
conn.query("select * from admin where aname = ? and apwd = ?",[uname,pwd],function( err, results, fields ){
if( err ) {
return emitter.emit("error",err);
}
emitter.emit("success",results,fields);
conn.release(); //归还数据库连接到连接池
});
}).on("error",function( err ) {
emitter.emit("error",err);
});
return emitter;
}
路由中是如此调用的 router.post("/",function( req,res,next ){ adminModule.login( req.body.uname,req.body.pwd ) .on(“success”,function( results, fields ){ if( results.length == 0 ) { res.json(info.error.loginerror); } else { req.session.admin = results[0]; res.json(info.message.success); } }).on(“error”,function( error ) { return next(error); }); })
@zouzhenxing 感谢您的用心回答
@zouzhenxing 鑫哥,我试了下。我通过把res传进去还是不行 如果在我的代码基础上改,我应该怎么传。麻烦您了。