《Nodejs开发指南》中动态视图助手在Express4.x下的问题
发布于 4 年前 作者 Heatwave 3876 次浏览 最后一次编辑是 3 年前 来自 问答

《Nodejs开发指南》101页中有如下示例:

var util = require('util');

app.helpers({
	inspect: function(obj) {
		return util.inspect(obj, true);
	}
});

app.dynamicHelpers({
	headers: function(req, res) {
		return req.headers'
	}
});

app.get('/helper', function(req, res) {
	res.render('helper', {
		title: 'Helpers'
	});
});

视图helper.ejs如下:

<%=inspect(headers)%>

结果就是访问http://localhost:3000/helper可以得到request信息。 但是helpers和dynamicHelpers在express3.x已经弃用了:Migrating from 2.x to 3.x 于是我用express4.x改写如下: app.js

var util = require('util');

var helper = require('./routes/helper');
app.use('/helper', helper);

// dynamic Helper
app.locals.inspect = function(obj) {
	return util.inspect(obj, true);
}

app.locals.headers = function(req, res) {
	return req.headers
}

helper.js

var router = express.Router();

router.get('/', function(req, res) {
	res.render('helper', {
		title: 'Helpers'
	});
});

module.exports = router;

helper.ejs

<%inspect(headers())%>

就是参照官方文档用locals代替了helpers,但运行后却得到“Cannot read property ‘headers’ of undefined”,貌似headers函数的req是undefined。 我想知道书上是怎么用动态视图助手通过headers函数获得get请求的req的呢? 还请各位不吝赐教,谢谢!

7 回复

看书学node就是坑,都是几年前的

基本都是0.10时代的东西,确实坑多

可是还是比较喜欢看书啊,哎。。。。。。 其实问题貌似就是怎样不在router.get的异步函数里获得get请求的req?

@Heatwave headers = function(req, res){}和请求req没什么关系嘛,inspect(headers(参数呢))

@DevinXian 感谢指点!!! 将routes/helper.js改为:

router.get('/', function(req, res) {
	res.render('helper', {
		title: 'Helper',
		_req: req,
		_res: res
	});
});

views/helper.ejs改为:

<%=inspect(headers(_req, _res))%>

后成功获取到req请求! { ‘user-agent’: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36’, ‘upgrade-insecure-requests’: ‘1’, ‘accept-language’: ‘en-US,en;q=0.8’, connection: ‘keep-alive’, accept: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8’, host: ‘127.0.0.1:3000’, ‘cache-control’: ‘no-cache’, pragma: ‘no-cache’, ‘accept-encoding’: ‘gzip, deflate, sdch’ } 谢谢!

虽然我还是不知道书上是怎样实现的。。。。。。

找到解决办法了! 在app.js中把以下代码写在user router的前面:

app.use(function(req, res, next) {
	res.locals.headers = req.headers;
	res.locals.inspect = function(obj) {
		return util.inspect(obj, true);
	};
	next();
});

views/helper.ejs为:

<%=inspect(headers)%>

routes/helper.js为:

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

router.get('/', function(req, res) {
	res.render('helper');
});

module.exports = router;

这样就可以了。 在http://segmentfault.com/a/1190000002620309这里得到的解决办法。

回到顶部