小编dou*_*oup的帖子

Node.js,Express和Dependency Injection

我正处于node.js项目的早期阶段,我正在寻求改进整个应用程序组织.在过去,我使用Symfony2(PHP),现在我在Angular中编写了很多代码,这两者都非常依赖于DI.所以,我真的很喜欢在node.js项目中应用相同原理的想法.

我知道包的存在Rewire,但是现在我想尝试DI方法.问题是,如何实现均衡以保持轻量级的感觉,使得与节点一起使用经过良好测试的依赖注入应用程序的可靠性(我知道经过充分测试的是给出了可靠性;-)).

节点模块

其中一个问题是,如何管理外部模块,如果某个对象需要fs模块该怎么办?正如Vojta Jina(来自AngularJS)在本文中所述:

所以对我来说最好的方法是这样的:模块是无状态的.它们只包含类/函数/常量的定义.

所以,我想我必须注入一切:

function Foo(fs) {
    this.fs = fs;
}

Foo.prototype.doSomething: function () {
    // this.fs...
};

module.exports = Foo;
Run Code Online (Sandbox Code Playgroud)

某处:

var fs  = require('fs');
var Foo = require('./Foo');
var foo = new Foo(fs);

foo.doSomething();
Run Code Online (Sandbox Code Playgroud)

表达

由于Express用于apply()调用处理程序,因此上下文丢失,我们无法使用this.所以我们留下了这些:

// foo.js
function Foo(fs) {
    this.fs = fs;
}

Foo.prototype.index = function () {
    var self = this;

    return function (req, res, next) {
        // …
Run Code Online (Sandbox Code Playgroud)

javascript dependency-injection node.js express

7
推荐指数
1
解决办法
7517
查看次数

Javascript Regex匹配第一个匹配项

我有这个正则表达式(它没有做我想要的):/^.*\/(eu|es)(?:\/)?([^#]*).*/实际上是js版本:/^.*/(eu|es)(?:/)?([^#]*).*/

嗯,它没有做我想要的,当然它的工作原理.:)鉴于此URL:

  • http:// localhost/es - > [1] = es,[2] =''
  • http:// localhost/eu/bla/bla #wop - > [1] = eu,[2] ='bla/bla'
  • http:// localhost/eu/bla/eubla - > [1] = eu,[2] ='bla'

前两个网址按预期工作.第三个不是我想要的.由于后来在网址上找到"eu",它与第二个eu而不是第一个eu匹配.所以我希望它符合这个:[1] ='eu',[2] ='bla/eubla'

我该怎么办?

谢谢.:)

javascript regex

5
推荐指数
1
解决办法
4978
查看次数

为什么 TypeScript 不强制执行接口签名?

所以,我有以下界面:

interface DoStuffInterface {
    doStuff(value: string | number): string | number;
}
Run Code Online (Sandbox Code Playgroud)

为什么在实现这个接口时TS不强制签名?

class NumberStuff implements DoStuffInterface {
    public doStuff(value: number): string | number { // <====== missing: | string
        return value;
    }
}

class StringStuff implements DoStuffInterface {
    public doStuff(value: string): string | number { // <====== missing: | number
        return value.toLowerCase();
    }
}
Run Code Online (Sandbox Code Playgroud)

这很容易被这样的东西打破:

var numberStuff = new NumberStuff();
var stringStuff = new StringStuff();

function run(thing: DoStuffInterface): void {
    console.log(thing.doStuff(42));
}

run(numberStuff);
run(stringStuff); // <====== this fails, due …
Run Code Online (Sandbox Code Playgroud)

typescript

5
推荐指数
1
解决办法
488
查看次数