如何在无可用数据库时基于Express.js/Hapi.js开发可无缝集成的REST API?
解决方案:无需等待数据库即可启动API开发并保障后续无缝集成
一、先基于现有表信息搭建API骨架
- 把已知表映射为对应的API资源,比如表
users对应/api/users的CRUD接口,不用纠结表关系,先搞定单个资源的接口结构:- Express示例:
const express = require('express'); const router = express.Router(); // 内存模拟数据 let users = [{ id: 1, name: '测试用户', email: 'test@example.com' }]; router.get('/api/users', (req, res) => { res.json({ code: 200, data: users, message: '请求成功' }); }); router.post('/api/users', (req, res) => { const newUser = { id: users.length + 1, ...req.body }; users.push(newUser); res.status(201).json({ code: 201, data: newUser, message: '创建成功' }); }); - Hapi示例:
const Hapi = require('@hapi/hapi'); const server = Hapi.server({ port: 3000, host: 'localhost' }); let users = [{ id: 1, name: '测试用户', email: 'test@example.com' }]; server.route({ method: 'GET', path: '/api/users', handler: () => { return { code: 200, data: users, message: '请求成功' }; } }); server.route({ method: 'POST', path: '/api/users', handler: (request) => { const newUser = { id: users.length + 1, ...request.payload }; users.push(newUser); return { code: 201, data: newUser, message: '创建成功' }; } });
- Express示例:
- 优先固定接口的请求/响应格式(比如统一返回
code/data/message结构),不管后续数据库怎么变,接口对外契约先确定。
二、用数据访问层(DAL)彻底隔离数据库依赖
- 专门抽离
dal目录,每个表对应一个数据操作文件,比如dal/user.js,所有数据操作都通过这个层完成,API层只调用DAL方法,不直接写数据逻辑:// dal/user.js(内存版本) let users = []; let nextId = 1; exports.getUsers = () => Promise.resolve([...users]); exports.createUser = (userData) => { const newUser = { id: nextId++, ...userData }; users.push(newUser); return Promise.resolve(newUser); }; - API层调用示例:
const userDal = require('../dal/user'); router.get('/api/users', async (req, res) => { const users = await userDal.getUsers(); res.json({ code: 200, data: users, message: '请求成功' }); }); - 这种结构下,后续数据库就绪后,只需要替换DAL层的实现,API层完全不用修改。
三、逐步补全表关系与业务逻辑
- 主动和产品/业务方确认核心业务流程,比如创建订单时是否需要关联用户ID,先在内存模拟中手动实现关联逻辑(比如创建订单时检查用户ID是否存在)
- 不确定的业务逻辑直接加
TODO注释占位,比如// TODO: 后续需确认是否要校验用户余额,不影响API骨架的开发进度 - 用参数校验工具固定入参规则:Express用
express-validator,Hapi用内置的Joi,提前拦截非法请求,后续数据库集成时校验逻辑可以直接复用。
四、数据库就绪后的无缝衔接
- 当数据库可用时,直接替换DAL层的实现为数据库操作代码,比如用Sequelize操作SQL数据库:
// dal/user.js(Sequelize版本) const User = require('../models/User'); exports.getUsers = () => User.findAll(); exports.createUser = (userData) => User.create(userData); - 因为API层和数据层完全解耦,替换后不需要修改任何API逻辑,直接运行测试即可完成集成。
额外实用建议
- 用Postman/Insomnia保存API测试用例,后续数据库集成后直接复用测试用例验证接口正确性
- 提前设计分页、排序等通用参数(比如
page/limit/sort),后续数据库查询可以直接复用这些参数 - 暂时跳过复杂事务逻辑,等数据库就绪后再补充,先保证基础CRUD接口可用
内容的提问来源于stack exchange,提问作者Alizaenal Abidin
相关产品推荐
相关产品推荐

