资讯专栏INFORMATION COLUMN

Node.js 多模块共享数据库连接

zhouzhou / 2303人阅读

摘要:本文介绍了在项目中不同模块之间共享数据库连接的方法。专门负责和数据库交互,用户和航班这两个模块都需要连接数据库,一开始我的代码是这样的引用连接数据库引用连接数据库且不说这种写法一点都不,这种方式本身就是错误的。

本文介绍了在 Node.js 项目中不同模块之间共享数据库连接的方法。

这个标题本身就是一个命题,因为使用默认方式的情况下,一个 Node.js 应用里的各个模块都是共享的同一个数据库连接。但是如果姿势不对,可能会很丑陋,甚至可能会出错。

你可以忽略下面这部分,直接切入正题

背景

最近在做专业课程设计,题目是“机票预订管理系统”。需求比较简单,就试着拿最近在学的 Node.js 来做了。本来还在调研用何种 Node.js 框架比较合适,看了几个框架之后发现这是杀鸡用牛刀,有看文档查资料的时间还不如直接动手写了。最后写完我会把代码放到 Github 上,欢迎大家批评指正。

数据库方面,以为我比较熟悉和喜欢 JSON (SQL 没学好就承认呗-_-#),所以就选择了 MongoDB。Node + Mongo 是近几年越来越热门的后端组合,网上有很多关于如何一起使用的资料。但为了节约时间(课程设计也就一个多星期),把精力多集中在系统和逻辑上,我用了 Mongoose 这个专门用于 MongoDB 数据建模的 Node.js 扩展,用它来大大减少操作数据库的代码。

正题

我建立了两个数据模型(Model),一个是用户(User),一个是航班(Flight),分别封装到了 user.js, flight.js 这两个模块(Module)里面。Model 专门负责和数据库交互,用户和航班这两个模块都需要连接数据库,一开始我的代码是这样的:

// ----- user.js -----
// require mongoose.js 引用mongoose.js
var M = require("mongoose");
// connect to database 连接数据库
M.connect("mongodb://localhost/test");
// ... some other code ...

// ----- flight.js -----
// require mongoose.js 引用mongoose.js
var M = require("mongoose");
// connect to database 连接数据库
M.connect("mongodb://localhost/test");
// ... some other code ...

// ----- models.js -----
var user = require("./user"),
    flight = require("./flight");

// ----- index.js -----
var Models = require("./models");

且不说这种写法一点都不 DRY,这种方式本身就是错误的。当我运行 index.js 时,会出现如下错误。

> node index.js
> Connection error: { [Error: Trying to open unclosed connection.] state: 2 }

错误是:尝试打开未关闭的连接。

所以我们应该在一个地方连接一次数据库,然后其他需要连接数据库的模块通过这个模块来和数据库交互。就好像插线板,义无反顾地吼叫道:“墙上就一个插座,你们不要抢了!放着我来!你们。。。就可以了!”

具体方案

我们把连接数据库的动作放到一个模块里,并且把连接暴露给整个应用中的其他模块,然后其他需要连接数据库的模块引用这个连接即可。

// ----- database.js -----
var M = require("mongoose");
M.connect("mongodb://localhost/test");
// reference to the database connection 为这个连接创建一个引用
var db = M.connection;
// expose to modules that require database.js 把这个引用暴露给引用 database 模块的其他模块
module.exports = db;

// ----- user.js ----- flight.js 类似 -----
// ... some other code ...
// 我们会在 models.js 中,把数据库连接的引用作为参数传进来
module.exports = function( db ){
    if( db ){
        // ... do things with the connection ... 如果连接了数据库,就可以执行数据库相关的操作了
    }
}

// ----- models.js -----
// require database module, retrieve the reference to database connection 引用 databse 模块,获取数据库连接的引用
var db = require("./database");
// 把数据库连接的引用传入需要连接数据库的模块,任务完成!
var user = require("./user")( db ),
    flight = require("./flight")( db );

这就是让一个 Node.js 应用的多个模块共享数据库连接的一种方法。是我在 StackOverflow 上面看到的。如果你有更好的方法,欢迎在评论中分享给大家!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18694.html

相关文章

  • 什么是Node.js

    Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹。从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟Joyent获得企业资助,再到今年发布Windows移植版本,Node.js的前景获得了技术社区的肯定。InfoQ一直在关注Node.js的发展,在今年的两次Qcon大会(北京站和杭州站)都有专门的讲座。为了更好地促进Node.j...

    CrazyCodes 评论0 收藏0
  • Node 基础学习

    摘要:既然这样,怎么理解中的单线程再捋一捋和的关系。在线程上,不会等待操作完成,继续执行后续的代码。这就是单线程异步。在中除了代码,一切都是并行的由于中主任务的执行是以单线程的方式进行,如果程序出错导致崩溃,就会终止整个流程。 node是什么 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模...

    alaege 评论0 收藏0
  • 系列3|走进Node.js进程模型

    摘要:例如,在方法中,如果需要主从进程之间建立管道,则通过环境变量来告知从进程应该绑定的相关的文件描述符,这个特殊的环境变量后面会被再次涉及到。 文:正龙(沪江网校Web前端工程师)本文原创,转载请注明作者及出处 之前的文章走进Node.js之HTTP实现分析中,大家已经了解 Node.js 是如何处理 HTTP 请求的,在整个处理过程,它仅仅用到单进程模型。那么如何让 Web 应用扩展到...

    snowell 评论0 收藏0
  • Electron初步【01】--主进程VS渲染进程&不同页面间共享数据

    摘要:主进程渲染进程主进程在中,跑里的主脚本的进程叫作主进程。主进程负责掌管所有的页面和它们相应的渲染进程。不同页面间共享数据非常简单,使用就能完成。 Electron使用了网页页面作为App的GUI,因此你可以将它看做是一个由JavaScript控制的一个小型的Chrome内核浏览器。 主进程VS渲染进程 主进程 在Electron中,跑package.json里的主脚本的进程叫作主进程。...

    Ajian 评论0 收藏0
  • 深入理解Node.js 进程与线程(8000长文彻底搞懂)

    摘要:在单核系统之上我们采用单进程单线程的模式来开发。由进程来管理所有的子进程,主进程不负责具体的任务处理,主要工作是负责调度和管理。模块与模块总结无论是模块还是模块,为了解决实例单线程运行,无法利用多核的问题而出现的。 前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过...

    Harpsichord1207 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<