You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无可用数据库时基于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: '创建成功' };
        }
      });
      
  • 优先固定接口的请求/响应格式(比如统一返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:57:05