Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

青灯夜游
풀어 주다: 2020-09-01 10:00:29
앞으로
1995명이 탐색했습니다.

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

Node.js는 유연한 구조와 엄격한 사양이 부족하여 복잡해 보이기 때문에 초보자에게 위협적일 수 있습니다. [동영상 튜토리얼 추천: node js 튜토리얼]

이 튜토리얼은 기본 REST 라우팅 및 기본 데이터베이스 상호 작용에 초점을 맞춘 Node.js, Express 프레임워크 및 MongoDB에 대한 빠른 가이드입니다. 모든 애플리케이션에서 사용할 수 있는 간단한 API 프레임워크 템플릿을 구축하게 됩니다.

이 튜토리얼은 다음을 대상으로 합니다. : REST API 및 CRUD 작업에 대한 기본적인 이해와 기본 JavaScript 지식이 있어야 합니다. ES6(주로 화살표 함수)를 사용하고 있는데 별로 복잡하지 않습니다.

이 튜토리얼에서는 생성, 읽기, 업데이트 및 삭제라는 네 가지 CRUD 작업을 모두 수행할 수 있는 Google Keep과 유사한 웹 메모 작성 애플리케이션의 백엔드 뼈대를 만듭니다.

구성

Node가 설치되어 있지 않은 경우 여기를 참조하세요.

새 디렉터리를 만들고 npm init를 실행한 다음 프롬프트에 따라 애플리케이션 이름을 "notable"(또는 원하는 다른 이름)로 지정하세요.

npm init
로그인 후 복사

완료되면 디렉터리에 package.json 파일이 생성됩니다. 프로젝트에 필요한 종속성 설치를 시작할 수 있습니다.

Express를 프레임워크로, MongoDB를 데이터베이스로, body-parser라는 패키지를 사용하여 JSON 요청을 지원합니다.

npm install --save express mongodb@2.2.16 body-parser
로그인 후 복사

또한 Nodemon을 개발 종속성으로 설치하는 것이 좋습니다. 이것은 파일이 변경되면 서버를 자동으로 다시 시작하는 매우 간단한 작은 패키지입니다.

다음을 실행하는 경우:

npm install --save-dev nodemon
로그인 후 복사

다음 스크립트를 package.json에 추가합니다.

// package.json
  "scripts": {
    "dev": "nodemon server.js"
  },
로그인 후 복사

완전한 package.json은 다음과 같아야 합니다.

// package.json
{
  "name": "notable",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "dev": "nodemon server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.15.2",
    "express": "^4.14.0",
    "mongodb": "^2.2.16"
  },
  "devDependencies": {
    "nodemon": "^1.11.0"
  }
}
로그인 후 복사

이제 server.js를 만들 수 있습니다. 파일을 작성하고 API를 빌드합니다.

저희 서버

server.js의 모든 종속성을 가져오는 것으로 시작됩니다.

// server.js
const express        = require('express');
const MongoClient    = require('mongodb').MongoClient;
const bodyParser     = require('body-parser');
const app            = express();
로그인 후 복사

MongoClient를 사용하여 데이터베이스와 상호 작용합니다. 앱은 Express 프레임워크의 인스턴스로도 초기화됩니다.

마지막으로 프로그램에 요청을 듣기 시작하라고 지시하는 것입니다.

포트를 지정하고 다음과 같이 듣기를 시작할 수 있습니다:

// server.js
const port = 8000;
app.listen(port, () => {
  console.log('We are live on ' + port);
});
로그인 후 복사

이제 npm run dev(또는 Nodemon이 설치되지 않은 경우 node server.js)를 실행하면 터미널에 표시됩니다. "우리는 포트 8000에 살고 있습니다" 프롬프트.

서버가 시작되었습니다. 하지만 아직 아무것도 할 수 없습니다.

다음에는 이 문제를 해결해 보겠습니다.

CRUD Routes

이 예에서는 메모 만들기, 메모 읽기, 메모 업데이트 및 메모 삭제의 4개 경로를 구축하려고 합니다.

이것은 Node.js를 사용하여 거의 모든 기본 경로를 구축하는 방법에 대한 아이디어를 제공합니다.

그러나 API를 테스트하려면 클라이언트를 모방하여 요청해야 합니다. 이를 위해 Postman이라는 훌륭한 앱을 사용하겠습니다. 이를 통해 사용자 정의 헤더와 매개변수를 사용하여 간단한 HTTP 요청을 할 수 있습니다.

Postman을 설치하고 라우팅 설정을 시작하겠습니다.

프로젝트 구조

대부분의 Node.js 튜토리얼(및 많은 실제 예제)은 모든 경로를 하나의 큰 routes.js 파일에 넣습니다. 이것이 나를 조금 불편하게 만든다. 반면, 파일을 별도의 폴더로 분할하면 가독성이 향상되고 대규모 애플리케이션을 더 쉽게 관리할 수 있습니다.

우리가 하고 있는 일이 대규모 애플리케이션은 아니지만 그래도 할 수 있습니다. index.jsnote_routes.js 파일이 포함된 경로 폴더가 있는 app 폴더를 만듭니다.

mkdir app
cd app
mkdir routes
cd routes
touch index.js
touch note_routes.js
로그인 후 복사

이 디렉토리는 간단한 작은 프로그램에 너무 과해 보일 수 있지만 처음부터 올바르게 만드는 것이 항상 합리적입니다.

첫 번째 경로

CRUD의 C부터 시작하겠습니다. 메모를 어떻게 작성하시겠습니까?

그래서 시작하기 전에 먼저 기초를 다져야 합니다. Express에서 경로는 Express 인스턴스와 데이터베이스를 매개변수로 사용하는 함수에 포함되어 있습니다.

다음과 같습니다:

// routes/note_routes.js
module.exports = function(app, db) {
};
로그인 후 복사

그런 다음 index.js:

// routes/index.js
const noteRoutes = require('./note_routes');
module.exports = function(app, db) {
  noteRoutes(app, db);
  // Other route groups could go here, in the future
};
로그인 후 복사

를 통해 이 함수를 내보낸 다음 server.js에서 사용하기 위해 가져올 수 있습니다.

// server.js
const express        = require('express');
const MongoClient    = require('mongodb').MongoClient;
const bodyParser     = require('body-parser');
const app            = express();
const port = 8000;
require('./app/routes')(app, {});
app.listen(port, () => {
  console.log('We are live on ' + port);
});
로그인 후 복사

데이터베이스가 설정되지 않았으므로 주의하세요. 아직 빈 객체를 전달하면 됩니다.

좋아, 이제 나만의 CREATE 경로를 만들 수 있습니다.

구문은 간단합니다.

// note_routes.js
module.exports = function(app, db) {
  app.post('/notes', (req, res) => {
    // You'll create your note here.
    res.send('Hello')
  });
};
로그인 후 복사

애플리케이션이 '/notes' 경로에 대한 post 요청을 받으면 콜백 내부의 코드(요청 개체(요청 또는 JSON의 매개변수 포함) 포함)를 실행합니다. 응답 객체.

Postman을 사용하여 테스트를 위해 localhost:8000/notes에 POST 요청을 보낼 수 있습니다.

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

你应该得到回复:'Hello'。

太好了!你创建了第一个真正的路由。

下一步是在你的请求中添加一些参数并在 API 中处理它们,最后添加到你的数据库中。

请求参数

在 Postman 中,在选择 x-www-form-urlencoded 单选按钮后,转到 Body 选项卡并添加一些键值对。

这会将编码后的表单数据添加到你的请求中,你可以使用 API ??处理该请求。

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

你可以去尝试更多的设置项。

现在在你的 note_routes.js 中,让我们输出 body 的内容。

// note_routes.js
module.exports = function(app, db) {
  app.post('/notes', (req, res) => {
    console.log(req.body)
    res.send('Hello')
  });
};
로그인 후 복사

用 Postman 发送请求,你会看到……undefined。

不幸的是,Express 无法自行处理 URL 编码的表单。虽然你确实安装了这个 body-parser 包......

// server.
const express        = require('express');
const MongoClient    = require('mongodb').MongoClient;
const bodyParser     = require('body-parser');
const app            = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
require('./app/routes')(app, {});
app.listen(port, () => {
  console.log('We are live on ' + port);
});
로그인 후 복사

Now you should see the body as an object in the terminal.
现在你应该将 body 视为终端中的对象。

{ title: 'My Note Title', body: 'What a great note.' }
로그인 후 복사

第一个路由的最后一步:设置数据库,然后添加数据。

最简单方法是通过 mLab 设置 Mongo 数据库的:它是最小的而且是免费的,设置的速度非常快。

创建帐户和 MongoDB 部署后,将用户的用户名和密码添加到数据库:

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

然后复制这里第二个 URL:

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

在项目根目录的目录配置中,创建一个db.js文件。

mkdir config 
cd config
touch db.js
로그인 후 복사

在里面,添加刚才的URL:

module.exports = {
  url : YOUR URL HERE
};
로그인 후 복사

别忘了把你的用户名和密码(来自数据库用户的密码,而不是你的 mLab 帐户)添加到URL中。 (如果你要将此项目提交到 Github 上,请确保包含 .gitignore 文件 像这样, ,不要与任何人分享你的密码。)

现在在你的 server.js 中,可以用 MongoClient 连接到数据库了,使用它来包装你的应用程序设置:

// server.js
const express        = require('express');
const MongoClient    = require('mongodb').MongoClient;
const bodyParser     = require('body-parser');
const db             = require('./config/db');
const app            = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err)
  require('./app/routes')(app, database);
  app.listen(port, () => {
    console.log('We are live on ' + port);
  });               
})
로그인 후 복사

如果你用的是最新版本的 MongoDB(3.0+),请将其修改为:

// server.js
const express        = require('express');
const MongoClient    = require('mongodb').MongoClient;
const bodyParser     = require('body-parser');
const db             = require('./config/db');
const app            = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended: true }));
MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err)
                      
  // Make sure you add the database name and not the collection name
  const database = database.db("note-api")
  require('./app/routes')(app, database);
  app.listen(port, () => {
    console.log('We are live on ' + port);
  });               
})
로그인 후 복사

这是你的基础架构的最后一个设置!

添加到你的数据库

MongoDB将数据存储在 collections 中。在你的项目中,你希望将笔记存储在一个名为 notes 的 collection 中。

由于将数据库作为路径中的 db 参数传入,因此可以像这样访问它:

db.collection('notes')
로그인 후 복사

创建笔记就像在集合上调用 insert 一样简单:

const note = { text: req.body.body, title: req.body.title}
  db.collection('notes').insert(note, (err, results) => {
}
로그인 후 복사

插入完成后(或由于某种原因失败),要么返回错误或反回新创建的笔记对象。这是完整的 note_routes.js 代码:

// note_routes.js
module.exports = function(app, db) {
  const collection = 
  app.post('/notes', (req, res) => {
    const note = { text: req.body.body, title: req.body.title };
    db.collection('notes').insert(note, (err, result) => {
      if (err) { 
        res.send({ 'error': 'An error has occurred' }); 
      } else {
        res.send(result.ops[0]);
      }
    });
  });
};
로그인 후 복사

试试看!使用 Postman 发送 x-www-form-urlencoded POST 请求,在 Body 选项卡下设置 titlebody

响应应如下所示:

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

如果你登录mLab,你还应该能够在数据库中看到创建的笔记。

READ 路由

现在可以稍微加快步伐。

假设你希望通过导航到 localhost:8000/notes/{id} 来获取刚创建的笔记。这是链接应该是localhost:8000/notes/585182bd42ac5b07a9755ea3。(如果你没有得到其中笔记的 ID,可以通过检查 mLab 或创建一个新的笔记)。

以下是 note_routes.js 中的内容:

// note_routes.js
module.exports = function(app, db) {
  app.get('/notes/:id', (req, res) => {
    
  });
  app.post('/notes', (req, res) => {
    const note = { text: req.body.body, title: req.body.title };
    db.collection('notes').insert(note, (err, result) => {
      if (err) { 
        res.send({ 'error': 'An error has occurred' }); 
      } else {
        res.send(result.ops[0]);
      }
    });
  });
};
로그인 후 복사

就像以前一样,你将在数据库 collection 中调用一个方法。在这里,它被恰当地命名为 findOne。

// note_routes.js
module.exports = function(app, db) {
  app.get('/notes/:id', (req, res) => {
    const details = { '_id': <ID GOES HERE> };
    db.collection(&#39;notes&#39;).findOne(details, (err, item) => {
      if (err) {
        res.send({'error':'An error has occurred'});
      } else {
        res.send(item);
      }
    });
  });
app.post('/notes', (req, res) => {
    const note = { text: req.body.body, title: req.body.title };
    db.collection(&#39;notes&#39;).insert(note, (err, result) => {
      if (err) { 
        res.send({ 'error': 'An error has occurred' }); 
      } else {
        res.send(result.ops[0]);
      }
    });
  });
};
로그인 후 복사

你可以通过 req.params.id 从 URL 参数中获取 id。但是,如果你试图将字符串插入上面的 <ID GOES HERE> 位置,它将无法正常工作。

MongoDB 不仅要求 ID 为字符串,还要求 ID 是一个对象,它们被之为 ObjectID。

别担心,这很容易解决。这是完整的代码:

// note_routes.js
var ObjectID = require('mongodb').ObjectID;
module.exports = function(app, db) {
  app.get('/notes/:id', (req, res) => {
    const id = req.params.id;
    const details = { '_id': new ObjectID(id) };
    db.collection(&#39;notes&#39;).findOne(details, (err, item) => {
      if (err) {
        res.send({'error':'An error has occurred'});
      } else {
        res.send(item);
      } 
    });
  });
app.post('/notes', (req, res) => {
    const note = { text: req.body.body, title: req.body.title };
    db.collection(&#39;notes&#39;).insert(note, (err, result) => {
      if (err) { 
        res.send({ 'error': 'An error has occurred' }); 
      } else {
        res.send(result.ops[0]);
      }
    });
  });
};
로그인 후 복사

尝试使用一个笔记 ID,它应如下所示:

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

DELETE 路由

实际上删除对象与查找对象几乎相同。你只需用 remove 函数替换 findOne 即可。这是完整的代码:

// note_routes.js
// ...
  app.delete('/notes/:id', (req, res) => {
    const id = req.params.id;
    const details = { '_id': new ObjectID(id) };
    db.collection(&#39;notes&#39;).remove(details, (err, item) => {
      if (err) {
        res.send({'error':'An error has occurred'});
      } else {
        res.send('Note ' + id + ' deleted!');
      } 
    });
  });
// ...
로그인 후 복사

UPDATE 路由

最后一个! PUT 方法基本上是 READ 和 CREATE 的混合体。你找到该对象,然后更新它。如果刚才你删除了数据库中唯一的笔记,那就再创建一个!

代码:

// note_routes.js
// ...
  app.put('/notes/:id', (req, res) => {
    const id = req.params.id;
    const details = { '_id': new ObjectID(id) };
    const note = { text: req.body.body, title: req.body.title };
    db.collection(&#39;notes&#39;).update(details, note, (err, result) => {
      if (err) {
          res.send({'error':'An error has occurred'});
      } else {
          res.send(note);
      } 
    });
  });
// ...
로그인 후 복사

现在你可以更新任何笔记,如下所示:

Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?

请注意这些代码还不完美 —— 比如你没有提供正文或标题,PUT 请求将会使数据库中的笔记上的那些字段无效。

API 完成

就这么简单!你完成了可以进行 CRUD 操作的 Node API。

本教程的目的是让你熟悉 Express、Node 和 MongoDB —— 你可以用简单的程序作为进军更复杂项目的跳板。

将来我将会编写系列教程,用不同的语言和框架创建更简单的API。如果你有兴趣,请点击关注!

更多编程相关知识,可访问:编程教学!!

위 내용은 Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿