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

Node.js Express中重复业务逻辑的放置位置及数据库操作疑问

Node.js 工具类(utils)的使用规范

1. 重复业务逻辑能否放入 utils 文件夹?

完全可以,这正是utils目录的设计初衷。把多处服务共用的重复逻辑(比如数据格式校验、字符串处理、通用计算逻辑等)抽离到utils中,能大幅减少代码冗余,后续修改逻辑时只需维护一处,提升代码的可维护性和一致性。

2. utils 文件中是否允许进行数据库操作?

没有绝对的禁止,但不建议直接在utils里写数据库操作,原因如下:

  • 职责混淆:utils的定位是通用工具函数,应该是纯逻辑或无状态的,数据库操作属于业务层/数据访问层的职责,放在utils里会打破单一职责原则。
  • 耦合性高:如果utils依赖数据库连接或ORM实例,会让工具函数和数据层强耦合,复用性下降——比如换个数据库或修改连接配置时,所有用到该工具的地方都要调整。
  • 难以测试:带数据库操作的工具函数测试时需要依赖数据库环境,增加了测试复杂度,而纯工具函数可以轻松做单元测试。

如果确实需要复用和数据库相关的逻辑,更合理的做法是:

  • 单独创建services或data-access目录,封装数据库操作的业务逻辑
  • 在utils中只保留纯逻辑处理,把数据库操作的部分作为参数传入(比如接受一个查询函数或数据结果)

举个例子:
// 不推荐的写法(utils里直接操作数据库)

// utils/userUtils.js
const db = require('../db');
async function getActiveUserCount() {
  return db.query('SELECT COUNT(*) FROM users WHERE is_active = 1');
}

// 推荐的写法

// data-access/userDao.js
const db = require('../db');
async function countActiveUsers() {
  return db.query('SELECT COUNT(*) FROM users WHERE is_active = 1');
}
// utils/numberUtils.js
function formatCount(count) {
  return count.toLocaleString();
}
// 业务层使用
const { countActiveUsers } = require('../data-access/userDao');
const { formatCount } = require('../utils/numberUtils');
async function showActiveUserCount() {
  const count = await countActiveUsers();
  return formatCount(count);
}

内容的提问来源于stack exchange,提问作者NatiT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:17:35