动态访问函数参数

时间:2018-01-01 17:19:13

标签: javascript node.js express

您有以下简单的ExpressJS应用程序,其中路由是基于配置动态创建的。我很难尝试将一堆参数传递给处理程序,以便在相应的控制器中返回值。

const express = require('express');

module.exports = class App {
  get routes() {
    return [
      {
        path: '/',
        verb: 'get',
        method: 'home',
        params: ['req.query.ref', 'req.query.country'],
      },
    ];
  }

  constructor() {
    this.app = express();
    this.register();
  }

  register() {
    const { routes } = this;
    routes.forEach((route) => {
      const {
        path, verb, method, params,
      } = route;
      // if you replace the params with [req.query.ref, req.query.country] it will work as expected
      this.app[verb](path, this.handler(this[method].bind(this), (req, res, next) => params));
    });
  }

  handler(promise, params) {
    return async (req, res, next) => {
      const bound = params ? params(req, res, next) : [];

      console.log(bound);

      try {
        const result = await promise(...bound);
        res.json(result);
      } catch (err) {
        throw err;
      }
    };
  }

  home(payload) {
    console.log(payload);
    return Promise.resolve({ status: 'OK' });
  }
};

2 个答案:

答案 0 :(得分:1)

也许您可以查看arguments对象。所有函数都有这个对象,它包含一个数组,其中包含函数中接收的所有参数。我想这可能就是你要找的东西。

JavaScript函数有一个名为arguments对象的内置对象。

参数对象包含调用(调用)函数时使用的参数数组。

这样你只需使用一个函数来查找(例如)数字列表中的最高值:

这是一个如何运作的例子:

x = findMax(1, 123, 500, 115, 44, 88);

function findMax() {
    var i;
    var max = -Infinity;
    for (i = 0; i < arguments.length; i++) {
        if (arguments[i] > max) {
            max = arguments[i];
        }
    }
    return max;
}

更多信息: https://www.w3schools.com/js/js_function_parameters.asp

答案 1 :(得分:1)

您的大多数问题都源于路线定义的结构。创建对要使用的东西的直接引用更有意义,而不是将函数引用等注释为字符串。

get routes() {
    return [{
        path: '/',
        method: this.get,
        endpoint: this.home,
        paramMap: req => [req.query.ref, req.query.country],
    }];
}

在其他地方进行适当的更改后,您将不再遇到您所描述的原始问题。