【问题标题】:How to get caller ip in node.js + express?如何在 node.js + express 中获取调用方 ip?
【发布时间】:2015-08-05 18:54:34
【问题描述】:

在带有 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)

怎么了?

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

根据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
    ...
});

在一个视图中你必须使用下面的 sn -p 来输出一个接受的 ip 地址。

footer
  p &copy; Me 2015 - Your IP: #{locals.currentIP}

由于您的currentIP() 函数导致的错误Cannot read property url of undefined at app.locals.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 的中间件之后。

【讨论】:

  • 好的。我同意你的看法,但它不起作用,虽然它没有给出错误。由于我想把它放在页脚中,所以每个页面都应该显示它,我已经把页脚放在 layout.jade 中,但是我应该把 res.locals 放在哪里?我不想将它放在特定页面上,例如您的示例,而是放在页脚中。
  • 您应该将res.locals 放在特定路由或中间件中。我已经更新了答案
猜你喜欢
  • 2021-08-19
  • 2016-11-27
  • 2012-04-06
  • 2017-04-05
  • 2012-05-31
  • 2021-08-15
  • 2010-11-04
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多