在具有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 &copy; 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的中间件之后。

07-24 19:39