您有以下简单的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' });
}
};
答案 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],
}];
}
在其他地方进行适当的更改后,您将不再遇到您所描述的原始问题。