这是如何工作的呢?Express (err, req, res, next)或(req, res, next)中可选的第
How does this work? Optional first argument used in Express (err, req, res, next) or (req, res, next)
使用Express/Connect,我可以设置任何一种格式的中间件功能:
function(req, res, next) // first argument will be a request
或
function(err, req, res, next) // first argument will be an error
从Express, Connect退到基本JavaScript:我不明白这是如何可能有一个可选的第一个参数?
如何表达知道我的函数将首先接受一个err
对象?我认为要实现这一点,结构必须像下面这样:
function(req, res, next, err)
我错过了一些基本的东西吗?是否可以查询一个函数期望有多少个参数?
中间件函数传递给表达式,因此arguments
变量无效。虽然length
是正确的…我想我已经弄明白了,如果能得到确认就好了。在下面的例子:
var fn;
fn = function (one, two) {};
console.log(fn.length); // 2
fn = function (one, two, three) {};
console.log(fn.length); // 3
我想我已经弄明白了,如果能确认一下是不是这样就好了
var fn; fn = function (one, two) {}; console.log(fn.length); // 2 fn = function (one, two, three) {}; console.log(fn.length); // 3
是的,那是正确的。Function
实例的length
属性是它拥有的形式参数(声明参数)的数量。这隐藏在规范的第13.2节,步骤14和15中。
因此,调用函数的代码很容易检查fn.length
并将可选的第一个参数传递给它,或者不传递给它,这取决于它。当然,这确实意味着完全有可能编写一个处理四参数版本的函数,但是通过使用arguments
而不是形式参数来欺骗框架。所以你不会那样做。: -)
(很抱歉第一次误解了你的问题)
第一个函数有3个参数,第二个函数有4个参数,因此Express/Connect查看参数的数量。
不能在参数之间切换
Express花了相当长的时间来查看函数的唯一性;也就是说,里面有多少个参数:
function foo(err, req, res, next) {
if (arguments.length === 3) { // err isn't there
next = res;
res = req;
req = err;
}
...
}
。检测有多少参数,并相应地调整变量。我甚至见过一些node .js模块可以自动为你做这些。
虽然我最近没有检查过,但在某些情况下,与arguments
内置混淆会禁用V8中的所有优化
相关文章:
- ES6生成器:.next()的输入值
- Expressjs/AngularJS:实现req-flash后出错
- 使用next、prev按钮制作简单的jQuery图像滑块
- Redux中间件在next()之前更改状态
- Node.js req.params.locationid not grabbing ID
- PassportJS/忘记密码:req.user只定义一次
- req.flash()节点表达式4
- 节点.js快速删除 req.body 不起作用
- 如何防止sails.js在所有视图中传递req对象
- 在node.jsexpress应用程序中,req.body没有得到<text区域>价值
- 如何禁用FuelUX向导步骤1中的NEXT按钮
- 如何从未定义的表单中获取req.body
- 如何在ES Next中扩展静态属性
- 当我将 GET /any 发送到自定义路由“GET /:id”时,我得到 req.params.id = 'favico
- .next() 未按预期工作
- 使用生成器函数 next() 作为 node.js 中的回调
- 在解析到next之前减少所有JS Promises
- 尝试触发点击document.ready中Bigcommerce Classic Next主题中的产品选项
- 为什么使用 .next() 选择所有 li 项而不是一个
- 这是如何工作的呢?Express (err, req, res, next)或(req, res, next)中可选的第