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

如何用Node.js创建自定义脚本生成Express+Sequelize项目文件?

可行,实现步骤如下

1. 创建核心生成脚本

在项目根目录新建generate.js文件,这是实现自动生成的核心文件。

2. 编写脚本逻辑

脚本需要完成接收命令行参数、创建目录(若不存在)、生成模板文件并写入三个核心步骤,以下是完整代码:

const fs = require('fs');
const path = require('path');

// 获取命令行传入的资源名称
const resourceName = process.argv[2];
if (!resourceName) {
  console.error('请传入要生成的资源名称,示例:node generate client');
  process.exit(1);
}

// 格式化名称:首字母大写用于模型类名,小写复数用于路由/表名
const upperCamelName = resourceName.charAt(0).toUpperCase() + resourceName.slice(1);
const pluralLowerCaseName = resourceName.toLowerCase() + 's';

// 定义各文件路径
const controllerPath = path.join(__dirname, 'src', 'controllers', `${resourceName}.controller.js`);
const modelPath = path.join(__dirname, 'src', 'models', `${resourceName}.model.js`);
const routesPath = path.join(__dirname, 'src', 'routes', `${resourceName}.routes.js`);

// 确保目标目录存在
['controllers', 'models', 'routes'].forEach(dir => {
  const dirFullPath = path.join(__dirname, 'src', dir);
  if (!fs.existsSync(dirFullPath)) {
    fs.mkdirSync(dirFullPath, { recursive: true });
  }
});

// Controller模板(基础CRUD逻辑)
const controllerTemplate = `const ${upperCamelName} = require('../models/${resourceName}.model');

// 创建资源
exports.create = async (req, res) => {
  try {
    const ${resourceName} = await ${upperCamelName}.create(req.body);
    res.status(201).json(${resourceName});
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// 查询所有资源
exports.findAll = async (req, res) => {
  try {
    const ${pluralLowerCaseName} = await ${upperCamelName}.findAll();
    res.status(200).json(${pluralLowerCaseName});
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// 查询单个资源
exports.findOne = async (req, res) => {
  try {
    const ${resourceName} = await ${upperCamelName}.findByPk(req.params.id);
    if (!${resourceName}) {
      return res.status(404).json({ message: '资源不存在' });
    }
    res.status(200).json(${resourceName});
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// 更新资源
exports.update = async (req, res) => {
  try {
    const [updatedCount] = await ${upperCamelName}.update(req.body, {
      where: { id: req.params.id }
    });
    if (!updatedCount) {
      return res.status(404).json({ message: '资源不存在' });
    }
    const updated${upperCamelName} = await ${upperCamelName}.findByPk(req.params.id);
    res.status(200).json(updated${upperCamelName});
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// 删除资源
exports.delete = async (req, res) => {
  try {
    const deletedCount = await ${upperCamelName}.destroy({
      where: { id: req.params.id }
    });
    if (!deletedCount) {
      return res.status(404).json({ message: '资源不存在' });
    }
    res.status(204).send();
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};
`;

// Model模板(Sequelize基础结构)
const modelTemplate = `const { DataTypes } = require('sequelize');
const sequelize = require('../../index'); // 假设你的Sequelize实例在根目录index.js中

const ${upperCamelName} = sequelize.define('${upperCamelName}', {
  // 示例字段,可根据需求修改/添加
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  // 更多字段请自行补充
}, {
  timestamps: true,
  tableName: '${pluralLowerCaseName}'
});

module.exports = ${upperCamelName};
`;

// Routes模板(绑定CRUD路由)
const routesTemplate = `const express = require('express');
const router = express.Router();
const ${resourceName}Controller = require('../controllers/${resourceName}.controller');

// 创建资源
router.post('/', ${resourceName}Controller.create);

// 查询所有资源
router.get('/', ${resourceName}Controller.findAll);

// 查询单个资源
router.get('/:id', ${resourceName}Controller.findOne);

// 更新资源
router.put('/:id', ${resourceName}Controller.update);

// 删除资源
router.delete('/:id', ${resourceName}Controller.delete);

module.exports = router;
`;

// 写入文件
fs.writeFileSync(controllerPath, controllerTemplate);
fs.writeFileSync(modelPath, modelTemplate);
fs.writeFileSync(routesPath, routesTemplate);

console.log(`✅ 已成功生成${resourceName}相关文件:`);
console.log(`- ${controllerPath}`);
console.log(`- ${modelPath}`);
console.log(`- ${routesPath}`);

3. 执行脚本生成文件

在命令行中运行以下命令(以生成client相关文件为例):

node generate client

执行后会自动在对应目录生成client.controller.js、client.model.js、client.routes.js三个文件。

4. 可选优化

  • 在package.json中添加快捷脚本,简化命令:
    "scripts": {
      "generate": "node generate"
    }
    
    之后可通过npm run generate client执行生成操作。
  • 可扩展脚本功能,比如支持通过命令行参数自定义模型字段、指定数据库表名等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:50:57