如何用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
相关产品推荐
相关产品推荐

