Javascript 动态访问函数参数

Javascript 动态访问函数参数,javascript,node.js,express,Javascript,Node.js,Express,Hi拥有以下简单的ExpressJS应用程序,其中路由是基于配置动态创建的。我很难将一组参数传递给处理程序,以便在相应的控制器中返回值 const express=require('express'); module.exports=类应用程序{ 获取路径(){ 返回[ { 路径:“/”, 动词“get”, 方法:'家', 参数:['req.query.ref','req.query.country'], }, ]; } 构造函数(){ this.app=express(); 这是regist

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

const express=require('express');
module.exports=类应用程序{
获取路径(){
返回[
{
路径:“/”,
动词“get”,
方法:'家',
参数:['req.query.ref','req.query.country'],
},
];
}
构造函数(){
this.app=express();
这是register();
}
寄存器(){
const{routes}=这个;
routes.forEach((route)=>{
常数{
路径、动词、方法、参数、,
}=路线;
//如果将参数替换为[req.query.ref,req.query.country],它将按预期工作
this.app[verb](path,this.handler(this[method].bind(this),(req,res,next)=>params));
});
}
处理程序(承诺、参数){
返回异步(req、res、next)=>{
const-bound=params?params(请求、恢复、下一个):[];
console.log(绑定);
试一试{
const result=等待承诺(…约束);
res.json(结果);
}捕捉(错误){
犯错误;
}
};
}
主(有效载荷){
控制台日志(有效载荷);
返回Promise.resolve({status:'OK'});
}

};如果您的参数具有相同的格式,则可以使用split构建查询

--更新--

此解决方案基于req或res,每个req或res有x个参数
const express=require('express');
module.exports=类应用程序{
获取路径(){
返回[
{
路径:“/”,
动词“get”,
方法:'家',
参数:['req.query.ref','req.query.country'],//已更改
},
];
}
构造函数(){
this.app=express();
这是register();
}
寄存器(){
const{routes}=这个;
routes.forEach((route)=>{
让{
路径、动词、方法、参数、,
}=路线;
this.app[verb](路径,this.handler(this[method].bind(this),(请求,res,next)=>this.paramsstringtoarayvalues(请求,res,params))
}));
});
}
ParamsStringToarray值(请求、恢复、参数){
返回params.map(param=>{
设paramArr=param.split('.');
让obj=paramArr.shift()=='req'?req:res
参数forEach(键=>{
obj=obj[键]
})
返回obj
})
}
处理程序(承诺、参数){
返回异步(req、res、next)=>{
const-bound=params?params(请求、恢复、下一个):[];
console.log(绑定);
试一试{
const result=等待承诺(…约束);
res.json(结果);
}捕捉(错误){
犯错误;
}
};
}
主(有效载荷){
控制台日志(有效载荷);
返回Promise.resolve({status:'OK'});
}

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

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

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

这样,您可以简单地使用函数查找(例如)数字列表中的最高值:

这是一个如何工作的示例:

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;
}
x=findMax(1123501154488);
函数findMax(){
var i;
var max=-无穷大;
对于(i=0;imax){
max=参数[i];
}
}
返回最大值;
}
更多信息:

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

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

一旦您在其他地方进行了适当的更改,您就不再存在您描述的原始问题。

您可能应该在分配绑定时使用
eval
,否则它将计算为字符串
req.query.ref
谢谢,但使用
eval
是否危险?是,但目前req.query.ref存储为字符串,您需要将其转换为实际值。您可以通过按“.”拆分并递归迭代对象来编写自定义转换器。转换器是一个有趣的建议,您能详细说明吗?这很好,但有一件事。。params数组值可以是
req
res.headers
req.query.name
中的任何值。这正是我要找的!!!谢谢你,也谢谢你的重组提示。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-更多信息添加。谢谢你的建议