Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 调用回调定义为字符串的函数_Node.js_Sails.js - Fatal编程技术网

Node.js 调用回调定义为字符串的函数

Node.js 调用回调定义为字符串的函数,node.js,sails.js,Node.js,Sails.js,我只是想这样称呼它 var method = 'serviceName.MethodName' 有什么方法可以调用它吗?谢谢我不知道有什么方法可以在不使用eval的情况下将该字符串的serviceName部分解析为对象。所以很明显你需要非常小心 也许: serviceName.methodName(function(output callback){ }); 我现在可以想到两种方法 JS评估 您可以使用javascript eval函数将任何字符串转换为代码段,如下所示。虽然eval是一个

我只是想这样称呼它

var method = 'serviceName.MethodName'

有什么方法可以调用它吗?谢谢

我不知道有什么方法可以在不使用eval的情况下将该字符串的serviceName部分解析为对象。所以很明显你需要非常小心

也许:

serviceName.methodName(function(output callback){

});

我现在可以想到两种方法

JS评估 您可以使用javascript eval函数将任何字符串转换为代码段,如下所示。虽然eval是一个快速的解决方案,但不应该使用,除非你身边没有其他选择

var方法='UserService.getData'; 评价方法

工厂模式 使用下面的模式获得服务

您需要以这样一种方式定义服务,即您可以使用模式访问它们

if (method.match(/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/) {
  var servicePart = eval(method.split('.')[0]);
  var methodPart = method.split('.')[1];
  servicePart[methodPart](...)
}
您可以使用下面的代码获取所需的服务

var Services = {
// UserService and AccountsService are again objects having some callable functions.
    UserService : {getData: function(){}, getAge: function(){}},
    AccountsService : {getData: function(){}, getAge: function(){}},
// getService is the heart of the code which will get you the required service depending on the string paramter you pass.
    getService : function(serviceName){
        var service = '';
        switch(serviceName){
            case 'User':
                service = this.UserService;
                break;
            case 'Accounts':
                service = this.AccountsService;
                break;
        }
    return service;
}
}

你的问题中有两个不同的问题:

如何按属性名称字符串访问对象属性? 如何通过名称字符串访问对象? 关于第一个问题-使用以下符号通过字符串很容易访问对象属性:

Services.getService('User')
关于第二个问题,这取决于serviceName是什么:

如果它是某个其他对象的属性,则使用someObject['serviceName']['MethodName'] 如果是局部变量,请考虑使用映射将字符串与对象关联;
const myObject = {
  myProp: 1,
};

console.log(myObject['myProp']);