《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的呢? 还请各位不吝赐教,谢谢!
看书学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这里得到的解决办法。