利用 `Express.js` 和 `better-sqlite3` 的最佳实践指南

打印 上一主题 下一主题

主题 585|帖子 585|积分 1755

在构建基于 Express.js 和 better-sqlite3 的应用时,遵照一些最佳实践可以帮助你更高效地管理数据库连接、提高代码的可读性和可维护性,并确保应用的安全性和性能。以下是一些详细的建议和示例代码。

一、数据库连接管理

1. 单例模式管理数据库连接
创建一个单独的文件来初始化和导出数据库实例,确保在整个应用程序生命周期内只打开一次数据库连接。
  1. // db.js
  2. const Database = require('better-sqlite3');
  3. const db = new Database('path/to/database.db', { verbose: console.log });
  4. module.exports = db;
复制代码
2. 中间件集成
通过中间件将数据库对象挂载到请求对象上,简化路由处置处罚函数中的数据库访问。
  1. // middleware/db.js
  2. const db = require('../db');
  3. module.exports = (req, res, next) => {
  4.     req.db = db;
  5.     next();
  6. };
复制代码
在主应用文件中利用该中间件:
  1. const express = require('express');
  2. const dbMiddleware = require('./middleware/db');
  3. const app = express();
  4. app.use(express.json());
  5. app.use(dbMiddleware);
复制代码

二、利用事件

对于必要保证数据一致性的利用,利用事件可以制止部分更新导致的数据不一致问题。
  1. // 在某个服务函数中
  2. const transaction = db.transaction((userId, name) => {
  3.     const insertStmt = db.prepare('INSERT INTO users (id, name) VALUES (?, ?)');
  4.     insertStmt.run(userId, name);
  5. });
  6. try {
  7.     transaction(1, 'John Doe');
  8. } catch (err) {
  9.     console.error('Transaction failed:', err.message);
  10. }
复制代码

三、预编译语句(Prepared Statements)

利用预编译语句不仅能提升性能,还能有效防止SQL注入攻击。
  1. // 在某个路由处理器中
  2. const stmt = db.prepare('SELECT * FROM users WHERE id = ?');
  3. const user = stmt.get(req.params.id);
  4. if (user) {
  5.     res.json(user);
  6. } else {
  7.     res.status(404).send({ message: 'User not found' });
  8. }
复制代码

四、错误处置处罚

对全部数据库利用举行适当的错误处置处罚,确保纵然发生错误也能提供清晰的信息或采取适当的规复措施。
  1. app.post('/users', (req, res) => {
  2.     try {
  3.         const stmt = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');
  4.         stmt.run(req.body.name, req.body.email);
  5.         res.status(201).send({ message: 'User created' });
  6.     } catch (err) {
  7.         console.error('Error inserting new user:', err.message);
  8.         res.status(500).send({ message: 'Internal Server Error' });
  9.     }
  10. });
复制代码

五、关闭数据库连接

只管大多数情况下不必要显式关闭 better-sqlite3 的数据库连接,但在某些特殊情况下(如长时间不运动或在多进程情况中),考虑在适当的时间关闭数据库连接以优化资源利用。
1. 监听退出信号
在应用退出前关闭数据库连接是一个好的做法,特别是当你有其他资源必要释放时。可以利用 Node.js 的 process 事故来监听退出信号并关闭数据库连接。
  1. function handleShutdown(signal) {
  2.     console.log(`Received ${signal}. Closing database connection.`);
  3.     db.close();
  4.     process.exit(0);
  5. }
  6. process.on('SIGINT', handleShutdown);
  7. process.on('SIGTERM', handleShutdown);
复制代码
2. 中间件模式中的关闭
假如你利用中间件模式来管理数据库连接,确保在应用程序关闭时可以或许正确关闭数据库连接:
  1. // middleware/db.jsconst Database = require('better-sqlite3');const db = new Database('path/to/database.db');module.exports = (req, res, next) => {    req.db = db;    next();};// 在应用的入口文件中添加关闭逻辑const dbMiddleware = require('./middleware/db');const db = require('./db'); // 假如你在单独的文件中初始化了dbfunction handleShutdown(signal) {
  2.     console.log(`Received ${signal}. Closing database connection.`);
  3.     db.close();
  4.     process.exit(0);
  5. }
  6. process.on('SIGINT', handleShutdown);
  7. process.on('SIGTERM', handleShutdown);
  8. app.use(dbMiddleware);
复制代码

六、测试与维护

编写单位测试:
为您的数据库交互逻辑编写单位测试,确保其按预期工作。
  1. const assert = require('assert');
  2. const db = require('./db');
  3. describe('Users', function() {
  4.     it('should insert a user', function() {
  5.         const stmt = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');
  6.         stmt.run('Test User', 'test@example.com');
  7.         
  8.         const user = db.prepare('SELECT * FROM users WHERE email = ?').get('test@example.com');
  9.         assert.strictEqual(user.name, 'Test User');
  10.     });
  11. });
复制代码
定期备份数据库:
定期备份数据库,并考虑实现自动化的备份策略。监控数据库性能,必要时优化查询或调整索引。

总结

通过遵照上述最佳实践,你可以构建出既安全又高效的基于 Express.js 和 better-sqlite3 的应用。以下是关键点:


  • 单一实例管理数据库连接:确保在整个应用程序生命周期内只打开一次数据库连接。
  • 利用事件:保证数据一致性,制止部分更新导致的数据不一致问题。
  • 预编译语句:提高性能并防止SQL注入攻击。
  • 错误处置处罚:对全部数据库利用举行适当的错误处置处罚,确保纵然发生错误也能提供清晰的信息或采取适当的规复措施。
  • 关闭数据库连接:在特定情况下(如应用退出时)关闭数据库连接,制止潜伏的资源泄漏。
  • 测试与维护:编写单位测试,定期备份数据库,并监控性能。
希望这些最佳实践能帮助你在构建高效、可靠的 Web 应用时做出更好的决定。假如有任何进一步的问题或详细场景的需求,请随时提问!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表