gpt4 book ai didi

node.js - 我是否需要在 NodeJS 中进行依赖注入(inject),或者如何处理...?

转载 作者:IT老高 更新时间:2023-10-28 21:45:36 24 4
gpt4 key购买 nike

我目前正在使用 nodejs 创建一些实验项目。我已经用 Spring 编写了很多 Java EE Web 应用程序,并且很欣赏那里的依赖注入(inject)的简便性。

现在我很好奇:如何使用 Node 进行依赖注入(inject)?或者:我什至需要它吗?是否有替代概念,因为编程风格不同?

我说的是简单的事情,比如共享数据库连接对象,到目前为止,我还没有找到让我满意的解决方案。

最佳答案

简而言之,您不需要像在 C#/Java 中那样需要依赖注入(inject)容器或服务定位器。由于 Node.js 利用了 module 模式,因此无需执行构造函数或属性注入(inject)。虽然你仍然可以。

JS 的伟大之处在于你可以修改任何东西来实现你想要的。这在测试时会派上用场。

看看我这个非常蹩脚的人为例子。

MyClass.js:

var fs = require('fs');

MyClass.prototype.errorFileExists = function(dir) {
var dirsOrFiles = fs.readdirSync(dir);
for (var d of dirsOrFiles) {
if (d === 'error.txt') return true;
}
return false;
};

MyClass.test.js:

describe('MyClass', function(){
it('should return an error if error.txt is found in the directory', function(done){
var mc = new MyClass();
assert(mc.errorFileExists('/tmp/mydir')); //true
});
});

注意 MyClass 如何依赖于 fs 模块?正如@ShatyemShekhar 提到的,您确实可以像其他语言一样进行构造函数或属性注入(inject)。但在 Javascript 中不是必需的。

在这种情况下,您可以做两件事。

您可以 stub fs.readdirSync 方法,也可以在调用 require 时返回完全不同的模块。

方法一:

var oldmethod = fs.readdirSync;
fs.readdirSync = function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};

*** PERFORM TEST ***
*** RESTORE METHOD AFTER TEST ****
fs.readddirSync = oldmethod;

方法二:

var oldrequire = require
require = function(module) {
if (module === 'fs') {
return {
readdirSync: function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
};
} else
return oldrequire(module);

}

关键是利用 Node.js 和 Javascript 的强大功能。注意,我是 CoffeeScript 人,所以我的 JS 语法可能在某处不正确。另外,我并不是说这是最好的方法,但它是一种方法。 Javascript 专家可能会加入其他解决方案。

更新:

这应该解决您关于数据库连接的具体问题。我会创建一个单独的模块来封装您的数据库连接逻辑。像这样的:

MyDbConnection.js:(一定要选择更好的名字)

var db = require('whichever_db_vendor_i_use');

module.exports.fetchConnection() = function() {
//logic to test connection

//do I want to connection pool?

//do I need only one connection throughout the lifecyle of my application?

return db.createConnection(port, host, databasename); //<--- values typically from a config file
}

然后,任何需要数据库连接的模块都将只包含您的 MyDbConnection 模块。

SuperCoolWebApp.js:

var dbCon = require('./lib/mydbconnection'); //wherever the file is stored

//now do something with the connection
var connection = dbCon.fetchConnection(); //mydbconnection.js is responsible for pooling, reusing, whatever your app use case is

//come TEST time of SuperCoolWebApp, you can set the require or return whatever you want, or, like I said, use an actual connection to a TEST database.

不要一字不差地遵循这个例子。这是一个尝试传达您利用 module 模式来管理依赖项的蹩脚示例。希望这会有所帮助。

关于node.js - 我是否需要在 NodeJS 中进行依赖注入(inject),或者如何处理...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250851/

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