
使用NestJS和Prisma構建REST API:身份驗證
初始化 Node.js 項目:
npm init -y
安裝 Express 和 Mongoose(用于與 MongoDB 交互):
npm install express mongoose
接下來,我們安裝開發時常用的工具:
npm install --save-dev dotenv nodemon
在 server.js
文件中配置服務器:
const express = require('express');
const app = express();
const mongoose = require('mongoose');
const dotenv = require('dotenv');
// 加載環境變量
dotenv.config();
// 連接 MongoDB
mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('連接到數據庫成功'))
.catch((err) => console.error('連接數據庫失敗:', err));
app.listen(3000, () => {
console.log('服務器啟動,監聽端口 3000');
});
使用 Mongoose 連接到 MongoDB 數據庫。我們將數據庫連接字符串存儲在 .env
文件中,以避免泄露敏感信息:
DATABASE_URL=mongodb://localhost:27017/subscribers
接下來,使用 Mongoose 創建一個訂閱者模型:
const mongoose = require('mongoose');
const subscriberSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
subscribedToChannel: {
type: String,
required: true
},
subscribeDate: {
type: Date,
required: true,
default: Date.now
}
});
module.exports = mongoose.model('Subscriber', subscriberSchema);
我們為訂閱者創建以下 API 路由:
GET /subscribers
:獲取所有訂閱者。GET /subscribers/:id
:根據 ID 獲取特定訂閱者。POST /subscribers
:添加新的訂閱者。PATCH /subscribers/:id
:更新訂閱者信息。DELETE /subscribers/:id
:刪除訂閱者。const express = require('express');
const Subscriber = require('./models/subscriber');
const router = express.Router();
// 獲取所有訂閱者
router.get('/subscribers', async (req, res) => {
try {
const subscribers = await Subscriber.find();
res.json(subscribers);
} catch (err) {
res.status(500).json({ message: '服務器錯誤' });
}
});
// 獲取指定 ID 的訂閱者
router.get('/subscribers/:id', async (req, res) => {
try {
const subscriber = await Subscriber.findById(req.params.id);
if (!subscriber) {
return res.status(404).json({ message: '未找到訂閱者' });
}
res.json(subscriber);
} catch (err) {
res.status(500).json({ message: '服務器錯誤' });
}
});
// 添加新訂閱者
router.post('/subscribers', async (req, res) => {
const subscriber = new Subscriber({
name: req.body.name,
subscribedToChannel: req.body.subscribedToChannel
});
try {
const newSubscriber = await subscriber.save();
res.status(201).json(newSubscriber);
} catch (err) {
res.status(400).json({ message: '請求無效,缺少必填字段' });
}
});
// 更新訂閱者
router.patch('/subscribers/:id', async (req, res) => {
try {
const subscriber = await Subscriber.findById(req.params.id);
if (!subscriber) {
return res.status(404).json({ message: '未找到訂閱者' });
}
if (req.body.name) subscriber.name = req.body.name;
if (req.body.subscribedToChannel) subscriber.subscribedToChannel = req.body.subscribedToChannel;
const updatedSubscriber = await subscriber.save();
res.json(updatedSubscriber);
} catch (err) {
res.status(400).json({ message: '請求無效' });
}
});
// 刪除訂閱者
router.delete('/subscribers/:id', async (req, res) => {
try {
const subscriber = await Subscriber.findById(req.params.id);
if (!subscriber) {
return res.status(404).json({ message: '未找到訂閱者' });
}
await subscriber.remove();
res.json({ message: '已刪除訂閱者' });
} catch (err) {
res.status(500).json({ message: '服務器錯誤' });
}
});
module.exports = router;
通過中間件函數 getSubscriber
來獲取訂閱者信息,避免在每個路由中重復代碼。
const getSubscriber = async (req, res, next) => {
try {
const subscriber = await Subscriber.findById(req.params.id);
if (!subscriber) {
return res.status(404).json({ message: '未找到訂閱者' });
}
res.subscriber = subscriber;
next();
} catch (err) {
res.status(500).json({ message: '服務器錯誤' });
}
};
使用 Postman 或 Visual Studio Code 的 REST Client 插件測試 API 路由,確保 CRUD 操作(創建、讀取、更新、刪除)都能正常工作。
獲取所有訂閱者:
GET http://localhost:3000/subscribers
添加訂閱者:
POST http://localhost:3000/subscribers
Content-Type: application/json
{
"name": "John Doe",
"subscribedToChannel": "Web Dev Simplified"
}
通過本教程,我們學習了如何使用 Node.js、Express 和 MongoDB 創建一個 RESTful API。從環境設置到數據庫操作,再到路由配置和中間件,您已經掌握了構建 API 的基礎知識。接下來,您可以根據需求擴展該 API,加入更多功能,優化性能,或進行安全加固。
原文引自YouTube視頻:https://www.youtube.com/watch?v=fgTGADljAeg