TypeScript Express 中间件

8

我有一个针对Express的简单身份验证中间件。它检查标头,如果一切正常,则调用next()。

现在当我在"DoSomething"时,“this”等于全局而不是“Test”的实例,而“this.DoSomeThingPrivate”未定义。

我尝试了

DoSomeThingPrivate :() => void;

this.DoSomeThingPrivate = () => {
...
}

模式。但是也不起作用。

import express = require('express');

var app = express();

class Test {    
    constructor() {        
    }

    DoSomething(req:express.Request, res:express.Response, next:Function) :void {       
        this.DoSomeThingPrivate();
    }

    private DoSomeThingPrivate() :void
    {       
    }
}

var test = new Test();

app.use(test.DoSomething);

与此相关

有什么想法……

谢谢

2个回答

20
以下方法应该可以正常工作,即在DoSomething中使用箭头函数,而不是DoSomethingPrivate
import * as express from 'express';

var app = express();

class Test {    
    constructor() {        
    }

    // important: 
    DoSomething = (req:express.Request, res:express.Response, next:express.NextFunction) => {       
        this.DoSomeThingPrivate();
    }

    private DoSomeThingPrivate() :void
    {       
    }
}

var test = new Test();

app.use(test.DoSomething);

注意: 您不应该需要使用bind。此外,https://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1


12
您还可以使用类型为 express.NextFunctionnext 参数。 - Onur Yıldırım
2
我认为这种方法比“bind”要好得多。 - djejaquino
5
您可以通过以下方式让编译器推断参数类型:将 DoSomething 输入为 express.RequestHandler = (req, res, next) => ...。请注意,此翻译仅供参考,具体语境可能需要根据上下文进行微调。 - Ian Liu Rodrigues

10

你只是将函数本身作为引用传递了进去。函数的实例将会成为全局变量。你需要将函数与 test 的实例绑定。

app.use(test.DoSomething.bind(test));

谢谢,伙计。那个方法很有效。我还在适应 TypeScript。 - Pintac
放心吧,那不是TypeScript特有的问题。你会发现这通常在JavaScript中发生。 - johngeorgewright
除了这个答案和@basarat的答案之外,TypeScript中'this'的一个很好的描述也在这里,它描述了问题的原因,这里提供的解决方案以及选择其中一个时的权衡。 - AronVanAmmers
双箭头语法DoSomething = (...params...) => { ...function contents...}相对于.bind的一个重要优势是在TypeScript中具有类型安全性。 - AronVanAmmers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接