参数对象与参数不同

时间:2017-12-08 10:24:31

标签: node.js express

我发现了一个非常奇怪的问题,Node&表达

我有一个中间件功能,可以通过三种不同的方式调用:

app.get('/', auth, handler)
app.get('/', auth('role'), handler)
app.get('/', auth('role', 'scope'), handler)

这样做的显而易见的方法是:

exports.auth = (a, b, c) => {

    let role, scope;

    switch(arguments.length) {
        case 3:
            // Called directly by express router
            handleAuth(a, b, c);
            break;

        case 2:
        case 1:
            // Called with role/scope, return handler
            // but don't execute
            role = a;
            scope = b;
            return handleAuth;
    }


    function handleAuth(req, res, next) {

        // Do some custom auth handling, can
        // check here if role/scope is set
        return next();

    }
}

然而,我为arguments.length得到了一些非常奇怪的结果。以第二种方式调用时,arguments.length == 5,并且所有参数都不是role

[ '0': '[object Object]',
  '1': 'function require(path) {\n    try {\n      exports.requireDepth += 1;\n      return mod.require(path);\n    } finally {\n      exports.requireDepth -= 1;\n    }\n  }',
  '2': '[object Object]',
  '3': '/Users/redacted/auth/index.js',
  '4': '/Users/redacted/auth' ]

如果我在函数中记录a, b, c,我会得到a: 'role', b: undefined, c: undefined

我试图在Runkit中重现它,但没有运气:https://runkit.com/benedictlewis/5a2a6538895ebe00124eb64e

2 个答案:

答案 0 :(得分:1)

箭头函数(arguments)中未公开

() =>。如果您需要它们,请使用常规功能。

exports.auth = function(a, b, c) {

  let role, scope;

  switch(arguments.length) {
    ...

旁注:您在箭头函数中引用的arguments实际上是从运行每个模块/所需代码时Node.js使用的包装函数中选取的。该功能可让您访问"魔法"变量,例如exportsrequiremodule__dirname__filename,这就是您看到5参数的原因。

答案 1 :(得分:0)

我认为case已被打破。

'use strict';
let express = require('express');
let app = express();

//app.get('/', auth, handler);
app.get('/', auth('role'), handler);
//app.get('/', auth('role', 'scope'), handler);

function auth (a, b, c) {
    let role;   
    if (a == 'role') {
        role = 'user';
        return handleAuth;
    }   

    if (a != 'role')        
        return handleAuth(a, b, c);

    function handleAuth(req, res, next) {
        console.log(role || 'guest');
        next();  
    }
}

function handler (req, res, next) {
    res.send('OK');
}

app.listen(3000, () => console.log('Listening on port 3000'));

P.S。 Imho,这个代码很棘手。