使用 bind 指定传递的回调函数参数的顺序

Specify the order of passed callback functions parameters using bind

我想在某些情况下将参数传递给回调函数。例如,我有两条路线要指向相同的功能。对于指定复数的路由我想允许删除多个东西。

server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', this.deleteSku);

deleteSku(req, res, allowMultiple = false) {
  //... delete code here ...
}

我知道这可以用下划线和 lodash 来完成

server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', _.bind(this.deleteSku, _, _, true));

但这对我来说很难看,而且我认为它会影响代码的可读性,尤其是当人们不熟悉下划线时。

我也知道您可以通过本机绑定指定参数,但这会将参数放在函数的前面。

server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', this.deleteSku.bind(null, true));

deleteSku (allowMultiple = false, req, res) {  }

现在重写 deleteSku 以首先处理 allowMultiple 感觉很奇怪,如果我不对单一路由案例进行绑定,它就会中断。

另一种选择是让 deleteSkudeleteSkus 方法本质上做同样的事情,但映射到不同的路由。我希望有更好的解决方案可以减少代码。

.bind() 只在开头绑定额外的参数。我同意你的看法,即开头不是你想要 allowMultiple 论点的地方。所以,.bind() 真的不会在那里为你做正确的事。 Javascript 中没有内置选项来后置参数而不是像 .bind() 那样前置。

因为我不完全确定 Express 何时将第三个参数传递给您的回调 (req, res, next),我会非常非常小心地使用默认参数,就像您对路由处理程序所做的那样。 Express 似乎很可能会传递第三个参数,而您的路由处理程序 this.deleteSku 会意外地将其解释为传递的 allowMultiple 参数。因此,我建议您这样做:

server.app.delete('/api/delete/sku', (req, res) => this.deleteSku(req, res, false));
server.app.delete('/api/delete/skus', (req, res) => this.deleteSku(req, res, true));

然后,勾选所有方框:

  1. 还是一行代码
  2. 它在做什么完全明确且可读
  3. 不依赖任何第三方库
  4. Express 将 next 参数传递给您的处理程序并造成混淆是完全安全的。