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.js 및 note_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 요청을 보낼 수 있습니다.
你应该得到回复:'Hello'。
太好了!你创建了第一个真正的路由。
下一步是在你的请求中添加一些参数并在 API 中处理它们,最后添加到你的数据库中。
请求参数
在 Postman 中,在选择 x-www-form-urlencoded 单选按钮后,转到 Body 选项卡并添加一些键值对。
这会将编码后的表单数据添加到你的请求中,你可以使用 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 部署后,将用户的用户名和密码添加到数据库:
然后复制这里第二个 URL:
在项目根目录的目录配置中,创建一个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 选项卡下设置 title 和 body。
响应应如下所示:
如果你登录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('notes').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('notes').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('notes').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('notes').insert(note, (err, result) => { if (err) { res.send({ 'error': 'An error has occurred' }); } else { res.send(result.ops[0]); } }); }); };
尝试使用一个笔记 ID,它应如下所示:
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('notes').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('notes').update(details, note, (err, result) => { if (err) { res.send({'error':'An error has occurred'}); } else { res.send(note); } }); }); // ...
现在你可以更新任何笔记,如下所示:
请注意这些代码还不完美 —— 比如你没有提供正文或标题,PUT 请求将会使数据库中的笔记上的那些字段无效。
API 完成
就这么简单!你完成了可以进行 CRUD 操作的 Node API。
本教程的目的是让你熟悉 Express、Node 和 MongoDB —— 你可以用简单的程序作为进军更复杂项目的跳板。
将来我将会编写系列教程,用不同的语言和框架创建更简单的API。如果你有兴趣,请点击关注!
更多编程相关知识,可访问:编程教学!!
위 내용은 Node.js로 API 서버를 빠르게 구축하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

Node용 Docker 이미지를 선택하는 것은 사소한 문제처럼 보일 수 있지만 이미지의 크기와 잠재적인 취약점은 CI/CD 프로세스와 보안에 상당한 영향을 미칠 수 있습니다. 그렇다면 최고의 Node.js Docker 이미지를 어떻게 선택합니까?

Node 19가 정식 출시되었습니다. 이 글에서는 Node.js 19의 6가지 주요 기능에 대해 자세히 설명하겠습니다. 도움이 되셨으면 좋겠습니다!

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

nodejs 실행 파일을 pkg로 패키징하는 방법은 무엇입니까? 다음 기사에서는 pkg를 사용하여 Node 프로젝트를 실행 파일로 패키징하는 방법을 소개합니다. 도움이 되기를 바랍니다.

노드가 npm 명령을 사용할 수 없는 이유는 환경 변수가 올바르게 구성되지 않았기 때문입니다. 해결 방법은 다음과 같습니다. 1. "시스템 속성"을 엽니다. 2. "환경 변수" -> "시스템 변수"를 찾은 다음 환경을 편집합니다. 3. nodejs 폴더의 위치를 찾습니다. 4. "확인"을 클릭합니다.
