Javascript 动态访问函数参数
Hi拥有以下简单的ExpressJS应用程序,其中路由是基于配置动态创建的。我很难将一组参数传递给处理程序,以便在相应的控制器中返回值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
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
中的任何值。这正是我要找的!!!谢谢你,也谢谢你的重组提示。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-更多信息添加。谢谢你的建议