Node.js Typescript express中间件
我有一个用于express的简单身份验证中间件。它检查头文件,如果所有文件都很酷,则调用next() 现在,当我在“DoSomething”中时,“this”等于全局,而不是“Test”和 “this.DoSomeThingPrivate”未定义 我已经试过了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
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中是类型安全的。您也可以对下一个参数使用typeexpress.NextFunction
。我认为这种方法比tbind
好得多。您可以让编译器通过键入DoSomething
来推断参数类型,就像这样:DoSomething:express.RequestHandler=(req,res,next)=>…