在具有express的node.js中,我想定义一个页脚,例如(在layout.jade中)
footer
p © Me 2015 - Your IP: #{currentIP}
在app.js中,我有:
app.locals.currentIP = function(req) {
return req.ip;
}
运行时,出现以下错误:
> 29| block content 30| footer
> > 31| p © Me 2015 - Your IP: #{currentIP()} 32| 33| script(
> src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js'
> ) 34| script( src='javascripts/bootstrap.js' )
>
> Cannot read property 'url' of undefined at app.locals.currentIP
> (c:\workspaces\nodejs.workspace\express_website\app.js:66:13) at
> eval (eval at <anonymous>
> (c:\workspaces\nodejs.workspace\express_website\node_modules\jade\lib\index.js:218:8),
> <anonymous>:199:69) at eval (eval at <anonymous>
> (c:\workspaces\nodejs.workspace\express_website\node_modules\jade\lib\index.js:218:8),
> <anonymous>:225:22) at res
> (c:\workspaces\nodejs.workspace\express_website\node_modules\jade\lib\index.js:219:38)
> at Object.exports.renderFile
> (c:\workspaces\nodejs.workspace\express_website\node_modules\jade\lib\index.js:380:38)
> at Object.exports.renderFile
> (c:\workspaces\nodejs.workspace\express_website\node_modules\jade\lib\index.js:370:21)
> at View.exports.__express [as engine]
> (c:\workspaces\nodejs.workspace\express_website\node_modules\jade\lib\index.js:417:11)
> at View.render
> (c:\workspaces\nodejs.workspace\express_website\node_modules\express\lib\view.js:126:8)
> at tryRender
> (c:\workspaces\nodejs.workspace\express_website\node_modules\express\lib\application.js:639:10)
> at EventEmitter.render
> (c:\workspaces\nodejs.workspace\express_website\node_modules\express\lib\application.js:591:3)
怎么了?
最佳答案
根据official doc
app.locals属性在应用程序的整个生命周期中一直存在,
与res.locals属性相反,该属性仅对
请求的生存期。
在您的情况下,最好使用res.locals.currentIP
代替app.locals.currentIP
,因为ip
的生存期绑定到请求而不是应用程序生命周期:
要将当前用户的ip传递给视图,只需使用:
app.post('/get/ip/address', function (req, res) {
res.locals.currentIP = req.ip
...
});
在视图中,您必须使用以下代码片段输出可接受的IP地址。
footer
p © Me 2015 - Your IP: #{locals.currentIP}
由于
Cannot read property url of undefined at app.locals.currentIP
功能引起的错误currentIP()
在另一个上下文中执行。我的建议是不要使用函数来输出当前用户的ip,而应使用标量值,如我上面的代码所示。您可以将
res.locals.currentIP
驻留在中间件中,以在所有视图中访问currentIP
变量,如下所示:var express = require('express');
var app = express();
app.enable('trust proxy');
app.use(express.static(__dirname + '/public'));
app.use(fucntion (req, res, next) {
res.locals.currentIP = req.ip;
next();
});
// routes does after the middleware !
// ...
app.listen(process.env.PORT || 3000);
请注意,您的路由定义应位于填充
res.locals.currentIP
的中间件之后。