我发现了一个非常奇怪的问题,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
答案 0 :(得分:1)
arguments
)中未公开 () =>
。如果您需要它们,请使用常规功能。
exports.auth = function(a, b, c) {
let role, scope;
switch(arguments.length) {
...
旁注:您在箭头函数中引用的arguments
实际上是从运行每个模块/所需代码时Node.js使用的包装函数中选取的。该功能可让您访问"魔法"变量,例如exports
,require
,module
,__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,这个代码很棘手。