关于res.render的问题
发布于 3 年前 作者 galaxy42 4875 次浏览 来自 问答
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 才能用查询出来的结果去渲染页面啊。
少侠们帮帮忙,讲讲原因。
3 回复

位置一在你的查找回调中,这是一个异步操作,等你的线程执行位置一的代码时,你的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传进去还是不行 如果在我的代码基础上改,我应该怎么传。麻烦您了。

回到顶部