如何在node.js + express中获取调用者ip?

时间:2015-08-05 09:22:27

标签: javascript node.js 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)

出了什么问题?

1 个答案:

答案 0 :(得分:1)

根据official doc

  

app.locals属性在应用程序的整个生命周期中都会持续存在,   与res.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

的中间件之后