如何在Express.js中组织数据库查询并实现后台面板CRUD操作?
解决controller.js无法导出查询逻辑及实现CRUD操作的问题
首先得指出你当前代码的核心问题:你把module.exports设成了一个函数,但函数内部定义的Query对象并没有被暴露出去——外部调用这个函数时,根本拿不到里面的查询语句。之前那种module.exports.msg = "hello"的方式能生效,是因为直接给导出对象挂载了属性,但确实不适合多操作场景的规整管理。
下面给你两种实用的改造方案,帮你把所有数据库操作都收拢到controller.js里,同时实现完整的CRUD功能:
方案一:直接导出封装好操作的对象(适合简单场景)
这种方式把数据库连接、查询语句、CRUD方法都封装在一个对象里直接导出,调用起来很直观:
/* ~Require Modules~*/ var mysql = require('mysql'); var dbconfig = require('./config/database'); /* ~MySQL Connection~ */ var connection = mysql.createConnection(dbconfig.connection); // 初始化数据库连接并处理错误 connection.connect((err) => { if (err) { console.error('数据库连接失败: ' + err.stack); return; } console.log('已连接到数据库,连接ID: ' + connection.threadId); }); /* ~数据库操作集合~ */ module.exports = { // 统一管理查询语句 queries: { readAll: 'SELECT * FROM page', create: 'INSERT INTO page SET ?', update: 'UPDATE page SET ? WHERE id = ?', delete: 'DELETE FROM page WHERE id = ?' }, // 读取所有page数据 getAllPages: function(callback) { connection.query(this.queries.readAll, callback); }, // 新增page数据 addPage: function(pageData, callback) { connection.query(this.queries.create, pageData, callback); }, // 更新指定ID的page数据 updatePage: function(pageData, pageId, callback) { connection.query(this.queries.update, [pageData, pageId], callback); }, // 删除指定ID的page数据 deletePage: function(pageId, callback) { connection.query(this.queries.delete, pageId, callback); } };
在routes/index.js里的调用示例:
const controller = require('../controller'); // 示例:获取所有页面数据并返回给前台 controller.getAllPages((err, results) => { if (err) throw err; // 这里可以把results传给前台模板,或者作为API响应返回 console.log('当前页面数据:', results); }); // 示例:添加一条新页面数据 const newPage = {title: '后台新增页面', content: '这是通过后台面板添加的内容'}; controller.addPage(newPage, (err, result) => { if (err) throw err; console.log('新增页面成功,ID为:', result.insertId); // 这里可以触发前台数据更新逻辑 });
方案二:导出初始化函数(支持灵活配置)
如果未来需要切换数据库配置、支持多连接,这种方式会更灵活:
/* ~Require Modules~*/ var mysql = require('mysql'); var dbconfig = require('./config/database'); module.exports = function(dbConfig = dbconfig.connection) { // 根据传入的配置创建连接(默认用全局配置) var connection = mysql.createConnection(dbConfig); connection.connect((err) => { if (err) { console.error('数据库连接失败: ' + err.stack); return; } console.log('已连接到数据库,连接ID: ' + connection.threadId); }); // 返回封装好的操作方法 return { queries: { readAll: 'SELECT * FROM page', create: 'INSERT INTO page SET ?', update: 'UPDATE page SET ? WHERE id = ?', delete: 'DELETE FROM page WHERE id = ?' }, getAllPages: (callback) => connection.query(this.queries.readAll, callback), addPage: (pageData, callback) => connection.query(this.queries.create, pageData, callback), updatePage: (pageData, pageId, callback) => connection.query(this.queries.update, [pageData, pageId], callback), deletePage: (pageId, callback) => connection.query(this.queries.delete, pageId, callback) }; };
调用方式:
// 使用默认配置初始化controller const controller = require('../controller')(); // 调用方法和方案一完全一致 controller.getAllPages((err, results) => { // 处理数据逻辑 });
额外建议
- 数据库操作都是异步的,如果你觉得回调嵌套麻烦,可以把方法改造成Promise风格,配合
async/await使用,代码会更简洁易读 - 推荐使用
mysql2库替代mysql,它原生支持Promise,对现代Node.js项目更友好 - 记得在服务关闭时关闭数据库连接,避免资源泄漏
内容的提问来源于stack exchange,提问作者EricTalv
相关产品推荐
相关产品推荐

