今天延續上次的API,要繼續了解API
1.API測試
2.API驗證與錯誤處理
3.API安全性與性能優化
API 測試是確保你的 API 在各種情況下都能正常運作的關鍵步驟。可以使用兩種方式來測試你的 API:
1.使用 Postman 或 cURL 進行手動測試
2.使用 Mocha 和 Chai 進行自動化測試
# 發送 GET 請求
curl -X GET http://localhost:3000/users
# 發送 POST 請求
curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"name": "New User"}'
npm install mocha chai supertest --save-dev
接著先撰寫一個測試用的程式碼:
const request = require('supertest');
const expect = require('chai').expect;
const app = require('../app'); // 引入你的 Express 應用
describe('GET /users', () => {
it('should return an array of users', (done) => {
request(app)
.get('/users')
.expect(200)
.end((err, res) => {
if (err) return done(err);
expect(res.body).to.be.an('array');
done();
});
});
});
describe('POST /users', () => {
it('should create a new user', (done) => {
request(app)
.post('/users')
.send({ name: 'New User' })
.expect(201)
.end((err, res) => {
if (err) return done(err);
expect(res.body.name).to.equal('New User');
done();
});
});
});
通過這樣的測試,你可以自動檢測 API 是否能夠正常處理各種請求,並檢查返回的結果是否符合預期。
在開發 API 時,必須對請求的數據進行驗證,以確保數據的有效性。接下來,我將學習如何在 Express 中處理這部分內容。
npm install express-validator
2.驗證請求數據:
const { body, validationResult } = require('express-validator');
app.post('/users',
body('name').isString().notEmpty(),
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const newUser = { id: users.length + 1, name: req.body.name };
users.push(newUser);
res.status(201).json(newUser);
});
這程式碼會驗證 name 是否為非空字符串,並在驗證失敗時返回 400 錯誤。
// 捕捉未處理的路由
app.use((req, res, next) => {
res.status(404).send('Sorry, cannot find that!');
});
// 全局錯誤處理器
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something went wrong!');
});
npm install helmet
const helmet = require('helmet');
app.use(helmet());
npm install morgan
const morgan = require('morgan');
app.use(morgan('combined')); // 使用「combined」模式來記錄詳細日誌
npm install express-rate-limit
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分鐘
max: 100 // 每個 IP 最多 100 次請求
});
app.use('/api/', apiLimiter); // 為所有 /api/ 路由設置限流