分享个人 Full-Stack JavaScript 项目开发经验
Node.js 提供了设置 http 服务的端口号和主机名的异步方法 server.listen([port][, hostname][, backlog][, callback])。其中,hostname 参数用于设置接受 IP 地址的形式。下面以 koa2 框架为例,说明 Web 应用程序如何获取客户端 IPv4 地址。
当你使用的是 v2.2.0 的 koa2,在入口文件 bin/www 中,可以找到:
server.listen(port);
hostname 参数被省略,则使用默认值 '::'。服务器将会在 IPv6 可用时接受任何 IPv6 地址上的连接。如果想要设置为接受 IPv4 地址,则使用参数 '0.0.0.0' ,即:
server.listen(port, '0.0.0.0');
值得一提,若省略 port 参数,或使用端口值0,则会让操作系统分配一个随机端口。这时可以使用 server.address().port 在 'listening' 事件发出后检索实际使用的端口:
server.on('listening', function () {
// server.address().port
});
若你使用的是 v2.3.0 的 koa2,在入口文件 app.js 中修改 app.listen 方法参数,如:
module.exports = app.listen(config.port, '0.0.0.0', () => {
console.log(`Listening on http://localhost:${config.port}`)
})
在 koa2 的路由/控制器中可获取 IP 地址:
module.exports = async (ctx, next) => {
// ctx.ip
// 若使用 Nginx 作为反向代理,则应配置代理请求头 proxy_set_header X-Real-IP $remote_addr;
// 然后通过 ctx.headers['x-real-ip'] 获取。使用 Nginx 请求头方式,并不需要修改上述参数。
};