목차
전제 조건
파일 구조 설정
构建路由
建立控制器
处理POST 的请求
处理GET 的请求
建立calculateDistance 函数
实现错误处理
在控制器文件中添加错误处理
设置验证
测试API
结论
웹 프론트엔드 JS 튜토리얼 이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

Feb 23, 2022 pm 08:18 PM
api node

이 기사에서는 실제 경험을 공유하고 Node에서 위치 분석 보고서 API를 구축하는 방법을 소개합니다. 이 튜토리얼을 마치면 Node.js의 오류 처리 및 좋은 파일 구조에 대해 더 잘 이해할 수 있을 것입니다. js. 좋은 이해입니다. 모두에게 도움이 되기를 바랍니다!

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

위도와 경도로 정의된 위치를 다른 데이터와 결합하여 비즈니스에 대한 통찰력을 생성할 수 있으며 이를 위치 분석이라고 합니다.

전 세계적으로 운영되는 기업은 전체 가치 사슬에서 위치 분석을 사용하여 사용자를 타겟팅하고, 서비스를 제공하고, 타겟 광고를 실행합니다. 소셜 미디어와 모바일 장치의 등장으로 위치 분석의 사용이 전 세계적으로 증가했습니다.

이 튜토리얼에서는 Node.js에서 간단한 위치 분석 보고 서비스 API를 구축하는 방법을 알아봅니다. 이 튜토리얼이 끝나면 자신의 프로젝트에 대해 이러한 유형의 API를 구축할 수 있게 됩니다. 또한 Node.js의 오류 처리 및 좋은 파일 구조에 대해 더 잘 이해할 수 있습니다.

시작하겠습니다!

전제 조건

이 튜토리얼을 진행하려면 다음이 필요합니다.

  • Node.js, Express 및 Git에 익숙함
  • Visual Studio 코드 편집기
  • Heroku 계정
  • Postman 계정

파일 구조 설정

먼저 파일 구조를 설정해야 합니다. 터미널을 열고 프로젝트의 모든 파일을 저장할 새 디렉터리를 만듭니다. 터미널에서 다음 명령을 입력하고 그 뒤에 폴더 이름 lars를 입력하세요. lars

mkdir lars
로그인 후 복사

在VS代码编辑器中打开lars 工作目录。

  code .
로그인 후 복사

你会看到你的VS Code窗口打开。

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

Visual Studio Code 窗口

通过在Visual Studio中打开你的终端并运行npm init -y ,初始化工作目录。

如果你想在VS Code之外的操作系统的终端中运行这个命令,请导航到lars 目录并运行下面的命令。

npm init -y
로그인 후 복사

上面的代码自动生成了package.json 文件。

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

VS Code显示创建的package.json文件

在本教程中,我们将使用Express作为一个依赖项。通过运行下面的命令来安装Express。

npm install express --save
로그인 후 복사

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

将Express作为依赖关系安装的命令

安装完Express后,你会注意到一个node_modules 文件夹被创建了。为了确认你已经安装了Express,请检查你的package.json 文件,你会看到Express作为一个依赖项被安装。

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

node_modules文件夹被创建,Express被添加到package.json中。

我们需要将Express导入我们的应用程序,因为它是一个npm模块。在与你的package.json 文件相同的目录下创建一个名为app.js 的新文件。

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

VS代码窗口的截图显示app.js已经创建。

在你的app.js 文件中,通过运行下面的代码requireExpress。

const express = require('express');
로그인 후 복사

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

导入Express

现在,调用Express来创建你的应用、路由和你的应用要运行的端口。

const app = express();
로그인 후 복사

Node.js实现了模块化,这意味着它将你的应用分成模块,或各种文件,并导出每个文件。我们将使用export 关键字导出app

module.exports = app;
로그인 후 복사

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

app.js文件

接下来,在与app.js 文件相同的目录下创建另一个名为server.js 的文件。Requireapp.js 文件导入server.js 文件。

const app = require('./app');
로그인 후 복사

在与server.js 相同的目录中创建一个名为config.env 的文件。config.env 文件将包含我们的应用程序需要的所有 [process.env](https://nodejs.org/dist/latest-v8.x/docs/api/process.html)我们的应用程序需要的所有密钥。在config.env 文件中,创建一个PORT 变量,并将PORT 设置为监听端口8000

PORT=8000
로그인 후 복사
로그인 후 복사

VS 코드 편집기에서 lars 작업 디렉터리를 엽니다. 🎜
const port = process.env.PORT || 3000;
로그인 후 복사
로그인 후 복사
🎜VS Code 창이 열리는 것을 볼 수 있습니다. 🎜🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜Visual Studio Code Window🎜🎜Visual Studio에서 터미널을 열고 npm init -y를 실행하여 작업 디렉터리를 초기화하세요. 🎜🎜VS Code가 아닌 운영 체제의 터미널에서 이 명령을 실행하려면 lars 디렉터리로 이동하여 아래 명령을 실행하세요. 🎜
app.listen(port, () => {
    console.log(`App listening on ${port}`)
});
로그인 후 복사
로그인 후 복사
🎜위 코드는 자동으로 package.json 파일을 생성합니다. 🎜🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜VS 코드는 생성된 package.json 파일을 보여줍니다. 🎜🎜이 튜토리얼에서는 Express를 종속성으로 사용합니다. 아래 명령을 실행하여 Express를 설치하십시오. 🎜
      const express = require('express');
로그인 후 복사
로그인 후 복사
🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜 Express를 종속성으로 설치하는 명령 🎜🎜Express를 설치하고 나면 node_modules 폴더가 생성되는 것을 확인할 수 있습니다. Express가 설치되어 있는지 확인하려면 package.json 파일을 확인하세요. 그러면 Express가 종속성으로 설치되어 있는 것을 볼 수 있습니다. 🎜🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜node_modules 폴더가 생성되고 package.json에 Express가 추가됩니다. 🎜🎜Express는 npm 모듈이므로 애플리케이션으로 가져와야 합니다. package.json 파일과 동일한 디렉터리에 app.js라는 새 파일을 만듭니다. 🎜🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜VS 코드 창의 스크린샷은 app.js가 생성되었음을 보여줍니다. 🎜🎜app.js 파일에서 다음 코드를 실행하여 require를 표현하세요. 🎜
        const app = require('../app');
로그인 후 복사
로그인 후 복사
🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜 Import Express🎜🎜이제 Express를 호출하여 애플리케이션이 실행될 애플리케이션, 경로 및 포트를 생성하세요. 🎜
        const router = express.Router();
로그인 후 복사
로그인 후 복사
🎜Node.js는 모듈성을 구현합니다. 즉, 애플리케이션을 모듈 또는 다양한 파일로 나누고 각 파일을 내보냅니다. export 키워드를 사용하여 app을 내보냅니다. 🎜
        module.exports = router;
로그인 후 복사
로그인 후 복사
🎜이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.🎜🎜 app.js 파일 🎜🎜다음으로 app.js 파일과 동일한 디렉터리에 server.js라는 이름의 다른 파일을 만듭니다. 필수 app.js 파일을 server.js 파일로 가져옵니다. 🎜
npm i fs --save
로그인 후 복사
로그인 후 복사
🎜server.js와 동일한 디렉터리에 config.env라는 파일을 만듭니다. config.env 파일에는 모든 [process.env](https://nodejs.org/dist/latest-v8.x/docs/api/process .html)<가 포함됩니다. /code>애플리케이션에 필요한 모든 키입니다. <code>config.env 파일에서 PORT 변수를 생성하고 PORT를 설정하여 포트 8000에서 수신 대기하도록 합니다. 🎜
PORT=8000
로그인 후 복사
로그인 후 복사

导入应用程序后,在server.js 文件中创建一个名为port 的常量。将其设置为你刚刚创建的PORT 变量和一个默认的端口3000

const port = process.env.PORT || 3000;
로그인 후 복사
로그인 후 복사

最后,我们将用.listen() 方法设置应用程序在该端口上监听。

app.listen(port, () => {
    console.log(`App listening on ${port}`)
});
로그인 후 복사
로그인 후 복사

构建路由

每当你访问一个网页或一个在网络上运行的应用程序时,你都在发出一个HTTP请求。服务器用来自后台或数据库的数据进行响应,这就是所谓的HTTP响应。

当你在一个网络应用程序上创建一个资源时,你正在调用POST 请求。同样地,如果你试图删除或更新一个Web应用上的资源,你正在调用DELETEPATCH 、或UPDATE 请求。让我们建立路由来处理这些请求。

在你的工作目录中创建一个名为routes 的文件夹,并在其中创建一个名为analyticsRoute.js 的文件。RequireanalyticsRoute.js 文件中表达,以设置API的路由。

      const express = require(&#39;express&#39;);
로그인 후 복사
로그인 후 복사

我们还需要从app.js 文件中require 我们的应用程序模块。

        const app = require(&#39;../app&#39;);
로그인 후 복사
로그인 후 복사

然后,我们创建我们的路由。

        const router = express.Router();
로그인 후 복사
로그인 후 복사

最后,我们要导出路由器。

        module.exports = router;
로그인 후 복사
로그인 후 복사

建立控制器

我们需要为控制器创建文件,将其导入我们的analyticsRoutes 文件。首先,在你的工作目录中创建一个名为controllers 的文件夹。

我们的API将使用用户提供的IP地址和坐标来计算距离和位置。我们的请求需要接受这些信息和来自用户的请求。

我们将使用一个POST 请求,因为用户在req.body 。为了保存这些信息,我们需要在控制器中require 一个fs 模块(文件系统)。

处理POST 的请求

controllers 文件夹中创建一个名为storeController.js 的文件。在storeController.js 文件中,我们需要导入fs 模块和fsPromises.readFile() 方法来处理返回的promise ,也就是用户的IP地址和坐标。

要安装fs 模块,在你的工作目录中打开你的终端,运行以下命令。

npm i fs --save
로그인 후 복사
로그인 후 복사

在你的文件顶部输入以下代码。

const fsp = require(&#39;fs&#39;).promises;
const fs = require(&#39;fs&#39;);
로그인 후 복사
로그인 후 복사

接下来,我们将创建一个控制器,处理我们的POST 请求的路由。我们将使用exports 关键字并创建一个接受三个参数的异步中间件函数

  • req: 代表请求对象
  • res: 代表响应对象
  • next: 函数在中间件输出后立即被调用。
postAnalytics = async(req, res, next) => {}
로그인 후 복사

现在,我们将把req.body 中的数据对象的属性保存到reportAnalytics 数组中。我们将设置一个Date() 对象,将任何数据的创建日期保存在一个createdAt 关键中。

reportAnalytics.push({...req.body, createdAt: new Date()});
로그인 후 복사

我们将创建一个名为storeAnalytics.json 的文件,使用JSON.stringify() ,将我们的reportAnalytics 数组的内容保存为一个字符串。

 await fsp.writeFile(`${__dirname}/storeAnalytics.json`, JSON.stringify(reportAnalytics));
로그인 후 복사

当用户提出POST 要求时,我们需要检查storeAnalytics.json 文件是否存在。如果该文件存在,我们需要读取该文件并保存输出。

输出包含一个名为reportFile 的常量,它存储了被读取的文件内容。在reportFile ,使用JSON.parse ,将文件的内容转换为一个JavaScript对象。

// checks if file exists
if (fs.existsSync(`${__dirname}/storeAnalytics.json`)) {
// If the file exists, reads the file
  const reportFile = await fsp.readFile(`${__dirname}/storeAnalytics.json`, &#39;utf-8&#39;)
// converts the file to JavaScript Object
reportAnalytics = JSON.parse(reportFile)
} else {
  // if file does not exist
   return (&#39;File does not exist&#39;);
}
로그인 후 복사

[fs.existsSync()](https://www.geeksforgeeks.org/node-js-fs-existssync-method/)方法同步地检查文件是否存在。它接受${__dirname}/storeAnalytics.json 路径作为其单一参数,并指向我们要检查的文件的位置。

我们将await 关键字与reportFile ,以等待用fsp.readFile() 方法读取文件的结果。接下来,我们用(${__dirname}/storeAnalytics.json 来指定我们要读取的文件的路径。我们将编码格式设置为utf-8 ,这将把从文件中读取的内容转换为一个字符串。

JSON.parse()reportFile 转换为JavaScript对象,并将其存储在reportAnalytics 数组中。else 语句块中的代码只有在文件不存在时才会运行。最后,我们使用了return 语句,因为我们想在代码运行后停止函数的执行。

如果文件被成功读取、创建并保存在storeAnalytics.json ,我们需要发送一个响应。我们将使用响应对象(res) ,它是我们的异步postAnalytics 函数的第二个参数。

    res.status(201).json({
        status: &#39;success&#39;,
        data: {
            message: &#39;IP and Coordinates successfully taken&#39;
        }
    })
로그인 후 복사

我们将用一个状态success 和数据信息IP and Coordinates successfully taken 来响应。

你的storeController.js 文件应该看起来像下面的屏幕截图。

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

处理GET 的请求

我们需要创建另一个控制器文件来处理我们的GET 请求。当用户向API发出GET 请求时,我们将根据他们的IP地址和坐标来计算他们的位置。

controllers 文件夹中创建一个名为fetchController.js 的文件。fsstoreController.js 文件中,我们需要require 模块和fsPromises.readFile() 方法来处理返回的promise

const fsp = require(&#39;fs&#39;).promises;
const fs = require(&#39;fs&#39;);
로그인 후 복사
로그인 후 복사

让我们创建控制器来处理我们对GET 请求的路由。我们将使用类似的中间件函数和参数来处理上面的POST 请求。

   exports.getAnalytics = async(req, res, next) => {}
로그인 후 복사

getAnalytics 中间件中,输入以下代码,从请求的查询中获得IP地址。

     const { ip } = req.query;
로그인 후 복사

现在,创建一个空数组,用来存储req.body 的内容。

     let reportAnalytics = [];
로그인 후 복사

正如我们之前所做的,我们需要检查storeAnalytics.json 文件是否存在。如果文件存在,我们将在reportFile 上使用JSON.parse ,将文件内容转换为一个JavaScript对象。

if (fs.existsSync(`${__dirname}/storeAnalytics.json`)) {
        const reportFile = await fsp.readFile(`${__dirname}/storeAnalytics.json`, &#39;utf-8&#39;)
        reportAnalytics = JSON.parse(reportFile)
    } else {
        return (&#39;File does not exist&#39;);
    }
로그인 후 복사

现在,我们可以在storeAnalytics.json 文件中保存用户的IP地址和坐标。任何时候用户请求根据提供的坐标计算地理位置,IP地址将以查询的形式包含在请求中。

现在我们已经从req.query 对象中得到了IP地址,我们可以编写代码来检查req.query 对象中提供的IP地址是否与存储在storeAnalytics.json 文件中的IP地址相同。

   for (let i=0; i<reportAnalytics.length; i++) {
        if (reportAnalytics[i].ip !== ip) {
           return (&#39;No Coordinates found with that IP&#39;);
        };
    }
로그인 후 복사

在上面的代码中,我们使用forloop 来循环浏览reportAnalytics 数组。我们将变量i ,代表当前元素在reportAnalytics 数组中的索引,初始化为0 。如果i小于reportAnalytics 数组的长度,我们将其递增。

接下来,我们检查reportAnalytics 数组的IP地址属性是否等于req.query 中提供的IP地址。

让我们计算一下只在最后一小时内存储的IP地址的位置。

    const hourAgo = new Date();
    hourAgo.setHours(hourAgo.getHours()-1);
    const getReport = reportAnalytics.filter(el => 
        el.ip === ip && new Date(el.createdAt) > hourAgo
    )
로그인 후 복사

在上面的代码块中,我们创建了一个名为hourAgo 的常量,并将其设置为一个Date 对象。我们使用setHours() 方法将hourAgo 设置为最后一个小时的getHours()-1

reportAnalytics 文件中的当前IP地址等同于或等于req.query 中传递的IP地址时,意味着数据是在最后一小时内创建的,getReport 创建一个常量,设置为一个新的数组。

创建一个名为coordinatesArray 的常量,它将只存储已经保存在getReport 数组中的坐标。

const coordinatesArray = getReport.map(element => element.coordinates)
로그인 후 복사

接下来,我们需要用坐标计算出位置。我们需要遍历coordinatesArray ,通过传入保存为坐标的两个值来计算位置。

    let totalLength = 0;
    for (let i=0; i<coordinatesArray.length; i++) {
        if (i == coordinatesArray.length - 1) {
            break;
        }
        let distance = calculateDistance(coordinatesArray[i], coordina         tesArray[i+1]);
        totalLength += distance;
    }
로그인 후 복사

在上面的代码中,totalLength 代表从两个坐标计算出来的总距离。为了遍历coordinatesArray ,我们需要初始化我们的计算结果。将totalLength 设置为零,初始化总距离。

第二行包含我们使用的迭代代码forloop 。我们用let i=0 来初始化i 变量。i 变量代表当前元素在coordinatesArray 的索引。

i<coordinatesArray.length 设置迭代的条件,只有当当前元素的索引小于coordinatesArray 的长度时才运行。接下来,我们在迭代中增加当前元素的索引,以移动到下一个元素,i++

接下来,我们将检查当前元素的索引是否等于数组中最后一个元素的编号。然后,我们暂停迭代代码的执行,用break 关键字移动到下一个。

最后,我们创建一个名为calculateDistance 的函数,接受两个参数,即第一和第二坐标值(经度和纬度)。我们将在另一个模块中创建calculateDistance ,并将其导出到fetchController.js 文件中,然后我们将最终结果保存在我们初始化的totalLength 变量中。

注意,每个请求都需要一个响应。我们将用一个200statusCode 和一个包含我们将计算的距离值的JSON来响应。只有在代码成功的情况下才会显示响应。

     res.status(200).json({distance: totalLength})
로그인 후 복사

你的fetchController.js 文件应该看起来像下面两个代码块。

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

fetchController.js文件

이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

fetchController.js文件的续篇

建立calculateDistance 函数

在你的工作目录中,创建一个名为utilities 的新文件夹,在里面创建一个名为calculateDistance.js 的文件。打开calculateDistance.js 文件,添加以下函数。

const calculateDistance = (coordinate1, coordinate2) => {
    const distance = Math.sqrt(Math.pow(Number(coordinate1.x) - Number(coordinate2.x), 2) + Math.pow(Number(coordinate1.y) - Number(coordinate2.y), 2));
    return distance;
} 
module.exports = calculateDistance;
로그인 후 복사

在第一行,我们创建一个名为calculateDistance 的函数,它接受两个参数:coordinate1coordinate2 。它使用下面的方程式。

  • Math.sqrt: 数学中的平方根
  • Math.pow :将一个数字提高到一个幂值
  • Number(): 将一个值转换为一个数字
  • coordinate1.x :第一个坐标(经度)的第二个值
  • coordinate2.x :第一个坐标的第一个值(经度)。
  • coordinate1.y :第二个坐标的第二个值(纬度)。
  • coordinate2.y :第二个坐标的第一个值(纬度)。

现在我们已经创建了calculateDistance 函数,我们需要将该函数require 到我们fetchController.js 文件的代码中。在fs 模块之后添加下面的代码。

const calculateDistance = require(&#39;../utilities/calculateDistance&#39;);
로그인 후 복사

实现错误处理

实现错误处理是很重要的,以防止我们的代码失败或某个特定的实现没有按照设计的方式工作。我们将在开发和生产中添加错误处理。

打开你的config.env 文件,运行NODE_ENV=development ,将环境设置为开发。

在你的controllers 文件夹中,创建一个名为errorController.js 的新文件。下面的代码片断创建了一个名为sendErrorDev 的函数,以处理在开发环境中遇到的错误。

const sendErrorDev = (err, res) => {
    res.status(err.statusCode).json({
        status: err.status,
        error: err,
        message: err.message,
        stack: err.stack,
    });
}
로그인 후 복사

我们将创建一个名为sendErrorDev 的函数,它接受两个参数,err 表示错误,res 表示响应。response.status 接收错误的statusCode ,并以JSON数据进行响应。

此外,我们将创建一个名为sendErrorProd 的函数,它将处理API在生产环境中遇到的错误。

const sendErrorProd = (err, res) => {
    if(err.isOperational) {
        res.status(err.statusCode).json({
            status: err.status,
            message: err.message
        });    
    } else {
        console.error(&#39;Error&#39;, err);
        res.status(500).json({
            status: &#39;error&#39;,
            message: &#39;Something went wrong&#39;
        })
    }
}
로그인 후 복사

在你的utilities 文件夹中,创建一个名为appError.js 的文件,并输入以下代码。

class AppError extends Error {
    constructor(message, statusCode) {
        super(message);
        this.statusCode = statusCode;
        this.status = `${statusCode}`.startsWith(&#39;4&#39;) ? &#39;fail&#39; : &#39;error&#39;;
        this.isOperational = true;
        Error.captureStackTrace(this, this.constructor);
    }
}
module.exports = AppError;
로그인 후 복사

我们将创建一个名为AppError 的类,它扩展了Error 对象。

然后,我们将创建一个构造函数,它将初始化该类的对象。它接受两个参数,叫做messagestatusCodesuper 方法用一个参数调用构造函数,将其传入message ,并获得对构造函数的属性和方法的访问。

接下来,我们将构造函数的statusCode 属性设置为statusCode 。我们将构造函数的status 属性设置为任何以4 开始的statusCode ,例如,将404 statusCode 设置为failerror

创建另一个名为catchAsync.js 的文件,并在其中添加以下代码。

module.exports = fn => {
    return (req, res, next) => {
        fn(req, res, next).catch(next);
    }
}
로그인 후 복사

在控制器文件中添加错误处理

Require appError.js 文件和catchAsync.js 文件在你的storeController.jsfetchController.js 文件中。将这两条导入语句放在两个文件中的代码顶部。

const catchAsync = require(&#39;../utilities/catchAsync&#39;);
const AppError = require(&#39;../utilities/appError&#39;);
로그인 후 복사

storeController.jsfetchController.js 文件中,用catchAsync() 方法包装你的函数,如下所示。

// For storeController.js file
exports.postAnalytics = catchAsync(async(req, res, next) => {...} 

// For fetchController.js file
exports.getAnalytics = catchAsync(async(req, res, next) => {...}
로그인 후 복사

接下来,在你的fetchController.js 文件中,运行AppError 类。

   for (let i=0; i<reportAnalytics.length; i++) {
        if (reportAnalytics[i].ip !== ip) {
           return next(new AppError(&#39;No Coordinates found with that IP&#39;, 404));
        };
    }
로그인 후 복사

接下来,在你的storeController.js 文件中运行AppError 类。

   if (fs.existsSync(`${__dirname}/storeAnalytics.json`)) {
        const reportFile = await fsp.readFile(`${__dirname}/storeAnalytics.json`, &#39;utf-8&#39;)
        reportAnalytics = JSON.parse(reportFile)
    } else {
        return next(new AppError(&#39;File does not exist&#39;, 404));
    }
로그인 후 복사

你的storeController.jsfetchController.js 文件中的代码应该看起来像下面的截图。

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

storeController.js文件的屏幕截图

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

fetchController.js文件第1-32行

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

fetchController.js文件第33-37行

设置验证

我们需要验证在req.body ,其中包括IP地址和坐标的数据,是正确的,而且格式正确。坐标应该至少有两个值,代表经度和纬度。

utilities 文件夹中,创建一个名为Validation 的新文件夹。在Validation 文件夹中,创建一个名为schema.js 的文件。schema.js 文件将包含req.body 中提供的任何数据的所需格式。我们将使用 [joi](https://www.npmjs.com/package/joi)验证器。

npm install joi
로그인 후 복사

schema.js 文件中输入以下代码。

const Joi = require(&#39;joi&#39;);
const schema = Joi.object().keys({
    ip: Joi.string().ip().required(),
    coordinates: Joi.object({
        x: Joi.number().required(),
        y: Joi.number().required()
    }).required()
})
module.exports = schema;
로그인 후 복사

joi 在上面的代码块中,我们require 验证器,用它来创建我们的模式。然后,我们将IP地址设置为总是一个字符串,并通过在请求体中要求它来验证IP地址。

我们将坐标设置为object 。我们将代表经度和纬度值的xy 值都设置为数字,并将其require ,以便我们的代码运行。最后,我们导出了模式。

在验证器文件夹中,创建另一个名为validateIP.js 的文件。在里面,我们将编写代码来验证IP地址,使用 [is-ip](https://www.npmjs.com/package/is-ip)npm包。让我们把这个包导出到我们的代码中。

validateIP.js 文件中,添加以下代码。

const isIp = require('is-ip');
const fsp = require(&#39;fs&#39;).promises;
const fs = require(&#39;fs&#39;);
exports.validateIP = (req, res, next) => {
    if(isIp(req.query.ip) !== true) {
        return res.status(404).json({
            status: 'fail',
            data: {
                message: 'Invalid IP, not found.'
            }
        })
    }
    next();
}
로그인 후 복사

运行以下命令,为我们的API安装必要的依赖项。

npm install body-parser cors dotenv express fs is-ip joi morgan ndb nodemon
로그인 후 복사

你的app.js 文件应该看起来像下面的屏幕截图。

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

app.js文件

在你的package.json 文件中的scripts 部分下,添加以下代码片段。

"start:dev": "node server.js",
    "debug": "ndb server.js"
로그인 후 복사

你的package.json 文件应该看起来像下面的截图。

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

package.json文件

用以下代码更新你的analyticsRoute.js 文件。

const express = require(&#39;express&#39;);
const app = require('../app');
const router = express.Router();
const validateIP = require('../utilities/Validation/validateIP');
const storeController = require('../controllers/storeController');
const fetchController = require('../controllers/fetchController');
router.route('/analytics').post(storeController.postAnalytics).get(validateIP.validateIP, fetchController.getAnalytics);
module.exports = router;
로그인 후 복사

现在,我们已经完成了我们的位置分析API的构建!现在,让我们测试一下我们的代码,以确保它的工作。

测试API

我们将使用Postman来测试我们的API。让我们启动我们的API以确保它在我们的终端中运行。

node server.js
로그인 후 복사

你会在你的终端看到以下输出。

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

终端

我们的API托管在Heroku上,它的最终输出应该看起来像下面的输出。

1이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.

你可以自己在托管的文档中测试这个API

https://documenter.getpostman.com/view/13856921/TzXumeXS

结论

位置分析是企业的一个伟大工具。位置信息可以让公司更好地服务于潜在客户和现有客户。

이 튜토리얼에서는 IP 주소와 좌표 형태로 위치 정보를 얻고 거리를 계산하는 도구를 만드는 방법을 배웠습니다. Node.js에서 파일 구조를 설정하고, GETPOST 요청을 처리하기 위한 경로를 설정하고, 오류 처리를 추가하고, 최종적으로 애플리케이션을 테스트했습니다.

이 튜토리얼에서 배운 정보를 사용하여 비즈니스 요구에 맞게 사용자 정의할 수 있는 자체 위치 보고 API를 구축할 수 있습니다.

게시물Build a location Analytics reporter API in Node.jsLogRocket Blog에 먼저 나타났습니다.

노드 관련 지식을 더 보려면 nodejs tutorial을 방문하세요!

위 내용은 이 문서에서는 Node.js에서 경량 위치 분석 보고 서비스 API를 구축하는 방법을 자세히 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? Mar 05, 2025 pm 05:57 PM

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

PHP 프로젝트에서 API 인터페이스를 호출하여 데이터를 크롤링하고 처리하는 방법은 무엇입니까? PHP 프로젝트에서 API 인터페이스를 호출하여 데이터를 크롤링하고 처리하는 방법은 무엇입니까? Sep 05, 2023 am 08:41 AM

PHP 프로젝트에서 API 인터페이스를 호출하여 데이터를 크롤링하고 처리하는 방법은 무엇입니까? 1. 소개 PHP 프로젝트에서는 종종 다른 웹사이트에서 데이터를 크롤링하고 이러한 데이터를 처리해야 합니다. 많은 웹사이트에서는 API 인터페이스를 제공하며, 우리는 이러한 인터페이스를 호출하여 데이터를 얻을 수 있습니다. 이 기사에서는 PHP를 사용하여 API 인터페이스를 호출하여 데이터를 크롤링하고 처리하는 방법을 소개합니다. 2. API 인터페이스의 URL과 매개변수를 얻으십시오. 시작하기 전에 대상 API 인터페이스의 URL과 필수 매개변수를 얻어야 합니다.

Angular 및 Node를 사용한 토큰 기반 인증 Angular 및 Node를 사용한 토큰 기반 인증 Sep 01, 2023 pm 02:01 PM

인증은 모든 웹 애플리케이션에서 가장 중요한 부분 중 하나입니다. 이 튜토리얼에서는 토큰 기반 인증 시스템과 기존 로그인 시스템과의 차이점에 대해 설명합니다. 이 튜토리얼이 끝나면 Angular와 Node.js로 작성된 완벽하게 작동하는 데모를 볼 수 있습니다. 기존 인증 시스템 토큰 기반 인증 시스템으로 넘어가기 전에 기존 인증 시스템을 살펴보겠습니다. 사용자는 로그인 양식에 사용자 이름과 비밀번호를 입력하고 로그인을 클릭합니다. 요청한 후 데이터베이스를 쿼리하여 백엔드에서 사용자를 인증합니다. 요청이 유효하면 데이터베이스에서 얻은 사용자 정보를 이용하여 세션을 생성하고, 세션 정보를 응답 헤더에 반환하여 브라우저에 세션 ID를 저장한다. 다음과 같은 애플리케이션에 대한 액세스를 제공합니다.

Laravel API 오류 문제를 처리하는 방법 Laravel API 오류 문제를 처리하는 방법 Mar 06, 2024 pm 05:18 PM

제목: Laravel API 오류 보고 처리 방법, 구체적인 코드 예제가 필요합니다. Laravel을 개발하다 보면 API 오류가 자주 발생합니다. 이러한 오류는 프로그램 코드 논리 오류, 데이터베이스 쿼리 문제, 외부 API 요청 실패 등 다양한 이유로 인해 발생할 수 있습니다. 이러한 오류 보고서를 처리하는 방법은 핵심 문제입니다. 이 문서에서는 Laravel API 오류 보고서를 효과적으로 처리하는 방법을 보여주기 위해 특정 코드 예제를 사용합니다. 1. Laravel의 오류 처리

Python을 사용하여 API 데이터를 CSV 형식으로 저장 Python을 사용하여 API 데이터를 CSV 형식으로 저장 Aug 31, 2023 pm 09:09 PM

데이터 기반 애플리케이션 및 분석 세계에서 API(애플리케이션 프로그래밍 인터페이스)는 다양한 소스에서 데이터를 검색하는 데 중요한 역할을 합니다. API 데이터로 작업할 때 액세스하고 조작하기 쉬운 형식으로 데이터를 저장해야 하는 경우가 많습니다. 그러한 형식 중 하나는 표 형식의 데이터를 효율적으로 구성하고 저장할 수 있는 CSV(쉼표로 구분된 값)입니다. 이 기사에서는 강력한 프로그래밍 언어인 Python을 사용하여 API 데이터를 CSV 형식으로 저장하는 프로세스를 살펴봅니다. 이 가이드에 설명된 단계를 수행하여 API에서 데이터를 검색하고, 관련 정보를 추출하고, 추가 분석 및 처리를 위해 CSV 파일에 저장하는 방법을 알아봅니다. Python을 사용한 API 데이터 처리의 세계에 대해 알아보고 CSV 형식의 잠재력을 활용해 보겠습니다.

React API 호출 가이드: 백엔드 API와 상호작용하고 데이터를 전송하는 방법 React API 호출 가이드: 백엔드 API와 상호작용하고 데이터를 전송하는 방법 Sep 26, 2023 am 10:19 AM

ReactAPI 호출 가이드: 백엔드 API와 상호 작용하고 데이터를 전송하는 방법 개요: 최신 웹 개발에서는 백엔드 API와 상호 작용하고 데이터를 전송하는 것이 일반적인 요구 사항입니다. 널리 사용되는 프런트엔드 프레임워크인 React는 이 프로세스를 단순화하는 몇 가지 강력한 도구와 기능을 제공합니다. 이 기사에서는 React를 사용하여 기본 GET 및 POST 요청을 포함하여 백엔드 API를 호출하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 필요한 종속성을 설치하십시오. 먼저 Axi가 프로젝트에 설치되어 있는지 확인하십시오.

Oracle API 사용 가이드: 데이터 인터페이스 기술 탐색 Oracle API 사용 가이드: 데이터 인터페이스 기술 탐색 Mar 07, 2024 am 11:12 AM

Oracle은 세계적으로 유명한 데이터베이스 관리 시스템 제공업체이며, Oracle의 API(응용 프로그래밍 인터페이스)는 개발자가 Oracle 데이터베이스와 쉽게 상호 작용하고 통합하는 데 도움이 되는 강력한 도구입니다. 이 기사에서는 Oracle API 사용 가이드를 자세히 살펴보고 독자들에게 개발 프로세스 중에 데이터 인터페이스 기술을 활용하는 방법을 보여주고 구체적인 코드 예제를 제공합니다. 1.오라클

Oracle API 통합 전략 분석: 시스템 간 원활한 통신 달성 Oracle API 통합 전략 분석: 시스템 간 원활한 통신 달성 Mar 07, 2024 pm 10:09 PM

Oracle API 통합 전략 분석: 시스템 간의 원활한 통신을 위해서는 특정 코드 예제가 필요합니다. 오늘날 디지털 시대에 내부 기업 시스템은 서로 통신하고 데이터를 공유해야 하며 Oracle API는 원활한 통신을 돕는 중요한 도구 중 하나입니다. 시스템 간 통신. 이 기사에서는 OracleAPI의 기본 개념과 원칙부터 시작하여 API 통합 전략을 살펴보고 마지막으로 독자가 OracleAPI를 더 잘 이해하고 적용할 수 있도록 구체적인 코드 예제를 제공합니다. 1. 기본 오라클 API

See all articles