参数不会传递给中间件

时间:2018-02-01 17:22:36

标签: javascript node.js

我正在编写一个koa2js应用程序,并使用hanrea / koa2-routing的修改版本(仍然可以正常工作)。

像这样使用它:

app.route('/').get(function (ctx, next){console.log(arguments); await next();})

我得到ctx, next个参数。但是当我像这样使用它时:

app.route('/').get(async (ctx, next)=>{console.log(arguments); await next();})

app.route('/').get(super.someFunction(ctx, next))

参数不会被传递。

[编辑] Jim Wright的答案为我做了。事实证明,你需要暂时编码:-)来检查代码中的基本错误。

1 个答案:

答案 0 :(得分:1)

您需要将该函数作为闭包传递:

app.route('/').get(super.someFunction)

以上假设someFunction的定义如下:

function someFunction(ctx, next) {
    // My middleware logic...
    next();
}

这是因为在javascript函数中是一等公民。这实际上意味着您可以像变量一样传递它们。请看以下示例:

function addAbc(str) {
    return str + "abc";
}
function doSomething(str, closure) {
    // closure is actually the addAbc function before it has been called
    return closure(str);
}
console.log(doSomething("The first letters of the alphabet are ", addAbc));
// Notice the lack of () after the function name. It is being passed in as a variable!

有关更多示例,请查看the Mozilla documentation on callback functions

您的代码的问题在于它实际上正在执行该函数,并使用返回的值作为回调,如下例所示:

function myMiddleware() {
    return "middleware was executed";
}
function doSomething(middleware) {
    console.log(middleware);
    middleware();
}
console.log("Using callback function properly:");
doSomething(myMiddleware);
console.log("Using callback function wrongly:");
doSomething(myMiddleware()); // Uncaught TypeError: middleware is not a function