如何获取当前正在执行的Meteor方法的名称?

时间:2014-10-22 23:12:05

标签: meteor

我可以从内部获取当前正在执行的Meteor方法的名称 相同)?这对于记录来说非常方便。

我在Meteor方法中检查了this。它是MethodInvocation的一个实例,似乎没有任何有用的方法来确定方法名称。

似乎很容易将方法名称添加到MethodInvocation和调用者,但我不确定维护者是否会接受为每个{{name字段添加MethodInvocation字段的补丁1}}实例。

已转发here

4 个答案:

答案 0 :(得分:3)

这不是理想的,但是这里有你如何使用Meteor.methods来获得这个功能,就像stubailo建议的那样:

var currentMethod = new Meteor.EnvironmentVariable();    

function log(message) {
  var method = currentMethod.get();
  if (method) {
    console.log(method + ": " + message);
  } else {
    console.log(message);
  }
}

var oldMeteorMethods = Meteor.methods;

Meteor.methods = function (object) {
  var methods = {};
  _.each(object, function (func, name) {
    methods[name] = function () {
      var self = this;
      var args = _.toArray(arguments);
      return currentMethod.withValue(name, function() {
        return func.apply(self, args);
      });
    };
  });
  oldMeteorMethods(methods);
}

Meteor.methods({
  example: function (arg1, arg2) {
    log("hello");
    return doSomethingElse(arg1) + arg2;
  }
});

function doSomethingElse(x) {
  log("doSomethingElse called with " + x);
  return x * 2;
}

// Meteor.call("example", 5, 6) logs:
// "example: hello"
// "example: doSomethingElse called with 5"

如果你不喜欢猴子补丁:

defineMethods = function (object) {
  var methods = {};
  _.each(object, function (func, name) {
    methods[name] = function () {
      var self = this;
      var args = _.toArray(arguments);
      return currentMethod.withValue(name, function() {
        return func.apply(self, args);
      });
    };
  });
  Meteor.methods(methods);
}

defineMethods({
  example: function (arg1, arg2) {
    log("hello");
    return doSomethingElse(arg1) + arg2;
  }
});

答案 1 :(得分:1)

使用 Meteor 1.10.1 很容易

你可以使用

this.name

例如

new ValidatedMethod({
  name: "pod.create",
  validate: new SimpleSchema({
    stuff: {
      type: String,
    }
}).validator(),
  run(pData) {
    console.log("methodname:" + this.name);
  }
});

输出:

I20210126-08:35:30.120(0)? methodname:pod.create

答案 2 :(得分:0)

我已经重新修改了@ user337的答案。现在你可以在方法函数中使用@name 将其添加到服务器代码(coffeescript):

currentMethod = new Meteor.EnvironmentVariable()
oldMeteorMethods = Meteor.methods

Meteor.methods = (object) ->
    methods = {}
    _.each object, (func, name) ->
        methods[name] = ->
            args = _.toArray(arguments)
            this.name = name
            currentMethod.withValue name, =>
                func.apply this, args
    oldMeteorMethods methods

答案 3 :(得分:0)

我的两美分,是一个完整的猴子补丁版本(没有下划线)。 在方法函数内部,您可以立即使用this.currentMethodName。

'D'