Node.js Typescript express中间件

Node.js Typescript express中间件,node.js,express,typescript,Node.js,Express,Typescript,我有一个用于express的简单身份验证中间件。它检查头文件,如果所有文件都很酷,则调用next() 现在,当我在“DoSomething”中时,“this”等于全局,而不是“Test”和 “this.DoSomeThingPrivate”未定义 我已经试过了 DoSomeThingPrivate :() => void; this.DoSomeThingPrivate = () => { ... } 模式。但也不起作用 import express = require('exp

我有一个用于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);

任何想法


谢谢

您只传递了对函数本身的引用。函数的实例将是全局的。您需要将函数绑定到
test
的实例

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

以下各项应能正常工作,即使用胖箭头表示
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
。还

谢谢你,伙计,这很管用。我还在习惯打字,不用担心。不过,这不是一个特定于Typescript的问题。你会发现这种情况通常发生在JavaScript中。除了这个答案和@basarat的答案之外,这里还有[TypeScript中对“this”的一个很好的描述][1],它描述了问题的原因、这里提供的解决方案以及选择其中一个时的权衡。[1] :双胖箭头语法
DoSomething=(…params…)=>{…函数内容…}的一个重要参数
.bind
的区别在于,双箭头在TypeScript中是类型安全的。您也可以对
下一个
参数使用type
express.NextFunction
。我认为这种方法比t
bind
好得多。您可以让编译器通过键入
DoSomething
来推断参数类型,就像这样:
DoSomething:express.RequestHandler=(req,res,next)=>…