gpt4 book ai didi

node.js - NodeJS Express 依赖注入(inject)和数据库连接

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:39 26 4
gpt4 key购买 nike

来自非 Node 背景,我的第一 react 是定义我的服务

MyService.js

module.exports = new function(dbConnection)
{
// service uses the db
}

现在,我希望每个请求有一个打开的数据库连接,因此我在中间件中定义:

res.locals.db = openDbConnection();

在一些使用 Express api 代码中:

api.js

var MyService = require(./services/MyService')

...

router.get('/foo/:id?', function (req, res) {
var service = new MyService(res.locals.db);
});

现在,由于 Node 首选的依赖注入(inject)方法是通过 require(...) 语句,因此我似乎不应该使用 MyService 的构造函数来注入(inject) db

假设我想要

var db = require('db');

MyService的顶部,然后以某种方式使用db.current....但是既然db本身就是一个模块,我该如何将db绑定(bind)到当前的res.locals对象呢?在 Node 中处理这种瘦的推荐方法是什么?

最佳答案

更新答案:2015 年 5 月 2 日

如果您想将数据库连接附加到每个请求对象,然后在您的服务中使用该连接,则必须以某种方式将该连接传递给myService。下面的示例展示了一种实现此目的的方法。如果我们尝试使用 db.current 或类似的东西,我们将在数据库模块中存储状态。根据我的经验,这会带来麻烦。

或者,我在 this previous answer 中列出了我已经使用(并且仍在使用)的方法。 。对于本示例来说,这意味着以下内容:

// api.js
var MyService = require(./services/MyService')

...

router.get('/foo/:id?', function (req, res) {
MyService.performTask(req.params.id);
});


// MyService.js
var db = require('db');
module.exports = {
performTask: function(id)
{
var connection = db.getOpenConnection();
// Do whatever you want with the connection.
}
}

通过这种方法,我们将数据库模块与 api/app/router 模块解耦,只有实际使用它的模块才会知道它的存在。

上一个答案:2015年5月1日

您所说的可以使用快速中间件来完成。它可能如下所示:

var db = require('db');

// Attach a DB connection to each request coming in
router.use(req, res, next){
req.locals.db = db.getOpenConnection();
next();
}

// Later on..
router.get('/foo/:id?', function (req, res) {
// We should now have something attached to res.locals.db!
var service = new MyService(res.locals.db);
});

我个人以前从未在 Express 应用程序中见过像 new MyService 这样的东西。这并不意味着它不能完成,但您可能会考虑这样的方法

// router.js
var MyService = require('MyService');
router.get('/foo/:id?', function (req, res) {
MyService.foo(res.locals.db);
});

// MyService.js
module.exports.foo(connection){
// I have a connection!
}

关于node.js - NodeJS Express 依赖注入(inject)和数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29989483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com