作为前端开发者,我们都知道获取用户信息对于实现客户端定位和生成用户画像非常重要。而获取用户 IP 是其中最基础的一步。在 Node.js 中,我们可以通过一些库来获取 IP,比如 Express 中的 req.ip 属性,但是这只是 IP 地址,很难直接解析成具体的地理位置等信息。因此,今天我们要介绍的是一个 npm 包:express-ipinfo,通过它我们可以轻松地获取用户的地理位置、时区、城市等信息。
安装
在命令行界面中输入以下命令进行安装:
npm install express-ipinfo
使用
在 Express 中,我们可以使用中间件来获取 IP 信息。express-ipinfo 提供了一个简单的中间件来处理请求,并设置 req.ipInfo 属性。要使用它,只需按照以下方式将其添加到 Express 应用程序中:
-- -------------------- ---- ------- ----- ------ - -------------------------- ----- ------- - ------------------- ----- --- - ---------- ------------------ ------------ ----- ---- -- - --------------------- --- ---------------- -- -- - ------------------- ------- -- ---- ------- ---
运行上述代码并访问 http://localhost:3000,就可以看到返回来的用户信息了:
-- -------------------- ---- ------- - ----- ------------ ----------- ------------ ------- --- --------- --- ---------- --- ------ --- ------ -- -
我们可以看到,返回来的信息包含了 IP 地址、主机名、城市、地区、国家、经纬度以及组织等信息。城市、地区和国家信息都是空的,这是因为我们没有提供任何位置信息。接下来,我们将针对这些信息作进一步的操作。
配置
express-ipinfo 可以通过传递一个配置对象来设置一些选项。下面是一个完整的配置对象及其默认值:
-- -------------------- ---- ------- - ------- ----- -------- - ------- ----- ----------- ---- -- -------- - ---------- ----- ------- ---- -- --- - ------------------- ------ --------------- ---- -- ----------- ----- ------------------------ ------ ------- - --- ----- --------- ----------- ----- ------- ------- --------- -------- --------------- ------------ --------------- ---- ------ ---- ----- - -
其中的每一个选项都有其独特的作用。比如,apiKey 选项指定了在使用 ipstack.io 提供的服务时所需的 API 密钥;maxMind.DbPath 选项指定了 MaxMind 数据库的路径;ip.fallbackToLoopback 选项设置将从 localhost 获取 IP 是否为备选方案等。
示例
现在,我们来使用 express-ipinfo 来获取具体的位置信息。首先,我们需要一个过滤 IP 地址的库来过滤出本地请求,我在这里使用了 ip-filter 库,使用方法如下:
npm install ip-filter
然后,我们将获取到的位置信息存放在 Redis 中,使用 Redis 需要安装 redis 库:
npm install redis
下面是完整的示例代码:
-- -------------------- ---- ------- ----- ------ - -------------------------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- -------- - --------------------- ----- ----- - ----------------- ----- --- - ---------- --------------------------- ------------------ ----- ------ - --------------------- ------------ ----- ---- -- - ----- -- - -------------- ---------------- ------- ---- -------- -- ------------- ------------- - ---------------------- ------- ---- -------- ------ ---------- ----- ------------ ------- --- -------- ----------- --- - ----- -------- - ------------ -------------------- ----- ---- -- - -- ----- - ------------------- - -- ----- - ------------------ ------ -------- --- ------ --------- ------ -------------------------- - ----- - ----- ------- ------- - - ----------- ----- ------- - - ----- ------- ------- -- -------------------- ------------------------ ----- ----- ----- -- - -- ----- - ------------------- - ---------------- -------- ------ --- ------ ----------------------------- --- ------------------ --- --- ---------------- -- -- - ------------------- ------- -- ---- ------- ---
在这个示例代码中,我们检查是否为本地请求,如果是,我们将直接返回一个本地位置;否则,我们将从 Redis 中获取缓存的位置信息,如果没有缓存数据,我们将使用 express-ipinfo 返回的信息,然后将其缓存到 Redis 中。在每一次请求中,我们都将使用 ipinfo()
中间件来获取最新的 IP 地址和位置信息,并将位置信息返回给前端。期间,使用了 redis 库将服务器的缓存到数据存储到 Redis 中。
现在,当你访问 http://localhost:3000,你将看到如下的数据:
{ "city": "San Francisco", "region": "California", "country": "United States" }
至此,我们就成功使用了 npm 包 express-ipinfo 来获取用户地理位置信息,并缓存到了 Redis 中。
指导意义
使用 express-ipinfo 可以大大地提高我们获取用户位置信息的效率,而且实现起来非常的简单。在实际开发中,我们可以通过配置选项来适应我们自己的业务需求,比如使用 API 密钥来调用第三方服务,或者使用 redis 来进行数据的缓存。同时,这个实例也介绍了如何将一个 express 中间件添加到一个 express 应用中,以及如何使用 redis 来将数据存储到一个外部数据源中。
总的来说,本文的示例代码和介绍能够帮助我们更好地了解 Node.js 并引导我们转向更加高效和优秀的 Node.js 开发。希望通过阅读本文,你也能够提升自己的技术水平,实现更加出色的网站和应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60065f76238a385564ab68e4