基于 Node.js 实现实时地理位置信息管理

阅读时长 15 分钟读完

在现代时代,实时地理位置信息管理已经成为了企业和个人必不可少的一部分。这种信息管理是指实时获取、存储、修改和查询用户设备的位置信息。为了实现这一目的,Node.js成为了一款非常有用的开源技术。

Node.js是什么?

Node.js是一个基于Chromium的开源、跨平台技术,它的主要目的是使JavaScript代码的后端逻辑变得更为容易。Node.js使用了 Google V8 JavaScript 引擎,它允许 JavaScript 直接运行在服务器上,提高了解释和执行 JavaScript 代码的速度。

实现步骤

构建一个Node.js服务器

首先,需要创建一个新项目。进入控制台,使用以下命令安装必要的Node.js模块。

接下来,安装Express,Express是一个流行的Node.js框架,它允许您快速构建Web应用程序。

在项目根目录中创建一个名为“server.js”的新文件,该文件将成为Node.js服务器的入口文件。打开“server.js”文件,并添加以下代码:

这个简单的应用程序使用HTTP端口3000启动了一个基本的Express服务器。使用以下命令运行服务器。

现在,访问http://localhost:3000,应该会看到“Cannot GET /”消息。

使用PostgreSQL实现数据存储

接下来,设计一个数据存储结构以存储地理位置信息。可以使用非关系型数据库,例如MongoDB。但这里,使用关系型数据库PostgreSQL。

首先,安装“pg”来连接PostgreSQL数据库。可以使用以下命令进行安装。

在创建数据库之前,需要为应用程序添加“dotenv”和“cors”中间件,并将可以使用的环境变量添加到“GraphQL”。

首先,使用以下命令安装“dotenv”和“cors”:

打开“server.js”并添加以下代码:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------
----- ------ - ------------------
----- ---- - ----------------

----------------

----------------
------------------------
---------------------------- --------- ----- ----

---------------- -- -- -
  ------------------- ------- -- ---- -------
---

在“server.js”文件添加以下数据库连接和创建表语句代码:

-- -------------------- ---- -------
----- - ---- - - --------------

----- ---- - --- ------
  ----------------- -------------------------
  ---- -
    ------------------- ------
  --
---

-- ------ -----
-----------
  ------- ----- -- --- ------ -------- -
    -- ------ ------- ----
    -------- ----- --- -----
    --------- ----- --- -----
    --------- --------- --- ---- ------- -----
  ----
  ----- -- -
    -- ----- -
      -------------------
    - ---- -
      ------------------ -------- ----------
    -
  -
--

上面的代码创建一个名为“location”的表,该表存储了每个设备的位置信息。

要使用PostgreSQL,请将数据库URL添加到环境变量中。在项目根目录下创建一个名为“.env”的新文件,并将以下内容添加到文件中:

将该文件中的“username”,“password”和“dbname”替换为您的PostgreSQL凭据。现在,应在PostgreSQL中创建数据库并将上面的URL更改为正确的值。

设计GraphQL的数据模型和API

有了数据表,现在就可以设计用于处理和查询数据库中位置信息的GraphQL API了。GraphQL(Graph Query Language)是一种查询语言,允许客户端指定返回的数据。GraphQL是一种强类型访问数据语言,自动验证查询的结构和类型。

首先,使用以下命令安装GraphQL:

打开“server.js”文件并添加以下代码:

-- -------------------- ---- -------
----- - ----------- - - -------------------
----- - ----------- - - ---------------------------

----- ------ - -------------
  ---- ----- -
    ------------ ------ --------
    ---------- ----------
  -

  ---- -------- -
    --------------------- ------- ---------- -------- --------
  -

  ---- -------- -
    --- ----
    --------- ------
    ---------- ------
    ---------- -------
  -
---

----- ---- - -
  --------- -- -- -- -- -
    ------ --- ----------------- ------- -- -
      -----------
        ------- - ---- -------- ----- -- - ----
        -----
        ----- -------- -- -
          -- ----- -
            ------------
          - ---- -
            -------------------------
          -
        -
      --
    ---
  --
  ---------- -- -- -
    ------ --- ----------------- ------- -- -
      ------------------ - ---- -------- ----- -- --------- ------ ----- -------- -- -
        -- ----- -
          ------------
        - ---- -
          ----------------------
        -
      ---
    ---
  --
  ------------ -- --------- --------- -- -- -
    ------ --- ----------------- ------- -- -
      -----------
        ------- ---- -------- ---------- ---------- ------ ---- --- --------- --- --------- ---------- -----------
        ---------- -----------
        ----- -------- -- -
          -- ----- -
            ------------
          - ---- -
            -------------------------
          -
        -
      --
    ---
  --
--

--------
  -----------
  -------------
    ------- -------
    ---------- -----
    --------- -----
  --
--

上述代码定义了一个名为“schema”的GraphQL架构,该架构定义了处理和查询位置信息的API的类型和结构。GraphQL架构由类型和根级别解析器组成。解析器是API的工作代码,每个便令都有一个解析器处理。

  • location(id: Int!): Location:这个解析器会将ID作为参数,并返回一个名为“Location”的对象, later
  • locations: [Location]:这个解析器会返回一个包含所有位置信息的名为“Location”的数组。
  • setLocation(latitude: Float!, longitude: Float!): Location:这个解析器将一个名为“Location”的对象插入到数据库中。

浏览器访问http://localhost:3000/graphql可以测试API。

查询位置信息

为了查询位置信息,需要使用“GraphiQL”界面构建GraphQL查询。以下是一个基本的GraphQL查询:

此查询将返回一个包含所有位置信息的数组。在运行查询之前,使用“GraphQL”插件确认GraphQL API已启动。可以使用以下命令启动API和GraphQL插件:

现在,使用以下命令启动API:

使用以下URL,http://localhost:3000/graphql,在浏览器中点击“GraphiQL”或输入以下查询,并点击右侧的“Run”按钮。

实时位置信息

最后,要实现实时位置信息,使用WebSocket是非常有用的。通过添加WebSocket,客户端可以与服务器建立长期连接,并保持开放状态。

首先,需要安装WebSocket模块。可以使用以下命令进行安装。

打开“server.js”文件并添加以下代码:

-- -------------------- ---- -------
----- --------- - --------------

----- -- - --- ------------------ --------- ---- ---

------------------- -------- -- -
  ------------------- ------------

  -- ---- --- -------- --------- -- --- --- ----------
  ------------------ - ---- -------- ----- -- --------- ------ ----- -------- -- -
    -- ----- -
      -------------------
    - ---- -
      ------------------------------------------
    -
  ---

  -- ------ --- --- -------- --- ---------
  ----- ----- - ------- ---------------
  ----------------- ----- -- -
    -- ----- -
      -------------------
    - ---- -
      -------------------- --------- -- -----------

      -------------------- ------ -- -
        --------------------- --- --------- -- ------

        ----- -------- - -----------------

        --- -
          -----------
            ------- ---- -------- ---------- ---------- ------ ---- --- --------- --- --------- ---------- -----------
            ------------------- --------------------
            ----- -------- -- -
              -- ----- -
                -------------------
              - ---- -
                ----- -------- - ----------------
                --------------------- --- --------- -- ----------
                --------------------------- -- -
                  -- ------------------ --- --------------- -
                    ----------------------------------------
                  -
                ---
              -
            -
          --
        - ----- ----- -
          -------------------
        -
      ---
    -
  ---
---

-- --- --------- -- ---- ------
----- ------ - ---------------- -- -- -
  ------------------- ------- -- ---- -------
---

-------------------- --------- ------- ----- -- -
  ------------------------- ------- ----- -------- -- -
    --------------------- ------- ---------
  ---
---

上述代码在Express服务器上启动了WebSocket。当新连接与服务器建立连接时,WebSocket服务器为先前的客户端发送所有现有位置信息。接下来,WebSocket服务器将等待新位置信息,并将新位置信息插入到PostgreSQL数据库中。

用以下代码测试WebSocket客户端:

-- -------------------- ---- -------
----- ------ - --- ---------------------------------

------------- - ------- -- -
  ---------------------- -- -------
--

-------------- - ------- -- -
  ---------------------- -- ---------
--

---------------- - ------- -- -
  ------------------------------------
--

使用以下示例代码,可以为地图创建客户端,该客户端更新所有新位置和实时位置。

-- -------------------- ---- -------
--------- -----
----- ----------
  ------
    ----- --------------- --
    ----- ---------------------------- ----------------- --
    ----- --------------- ---------------------------- ------------------ --
    --------------- --- ----------------
    -------
      ---- -
        ------- ------
      -
    --------
  -------
  ------
    ---- ---------------

    --------
      ----- --- - -----------------
      ----- ------ - --- ---------------------------------

      ------------- - ------- -- -
        ---------------------- -- -------
      --

      -------------- - ------- -- -
        ---------------------- -- ---------
      --

      ---------------- - ------- -- -
        ----- ---- - -----------------------

        ------------------- -- -
          ----- ------ - --- ---------------------------
            --------- - ---- ------------------ ---- ------------------ --
            ---- ----
          ---
        ---
      --
    ---------
  -------
-------

通过WebSocket发送位置信息:

该应用程序将通过WebSocket从编辑应用程序接收实时位置信息,并在地图上显示此位置。

结论

通过此应用,将了解:

  • 如何使用Node.js构建服务器
  • 如何访问PostgreSQL数据库
  • 如何使用GraphQL架构API
  • 如何使用WebSocket实现实时位置信息

这个应用程序可以与编辑应用程序一起使用,例如类似Uber的应用程序进行合作,并通过WebSocket接收地理位置信息。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67496e6da1ce0063545ef8ef

纠错
反馈