访问nodejs上的function.caller

时间:2014-09-11 05:08:37

标签: javascript node.js

我有一个依赖于function.caller的任务来完整性地检查调用者是否被授权。

根据这个网址,所有主流浏览器都支持来电...我的所有单元测试都通过了:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

但是,nodejs拒绝所有访问function.caller的尝试(将其报告为null)。

我愿意接受有关在nodejs上工作的建议......我不想让这个框架只适用于浏览器。

谢谢!

4 个答案:

答案 0 :(得分:11)

Caller-id npm包让它像派对一样简单:https://www.npmjs.com/package/caller-id 来自文档:

var callerId = require('caller-id');

// 1. Function calling another function
function foo() {
    bar();
}
function bar() {
    var caller = callerId.getData();
    /*
    caller = {
        typeName: 'Object',
        functionName: 'foo',
        filePath: '/path/of/this/file.js',
        lineNumber: 5,
        topLevelFlag: true,
        nativeFlag: false,
        evalFlag: false
    }
    */
}

答案 1 :(得分:0)

因为function.caller在nodejs中工作,但在与Object.defineProperty getters / setter结合使用时失败,我会认为这是nodejs中的一个错误,而不是nodejs选择不支持function.caller。< / p>

答案 2 :(得分:0)

我参加这个派对的时间比较晚,但是我也试图使用arguments.caller,经过大量的反复试验,如果你使用原型,它就有可能。

这不起作用:

class MyClass {
    watchProperties() {
        Object.defineProperty(this, 'myproperty', {
            get: function f(value) { 

            },
            set: function f(value) { 
                console.log(arguments.caller.name);
            }
        });
    }
}


var foo = new MyClass;
foo.watchProperties();

foo.myproperty = 'bar';

但是通过使用原型而不是:

类MyClass {

}

MyClass.prototype.watchProperties = function() {
    Object.defineProperty(this, 'myproperty', {
        get: function f(value) { 

        },
        set: function f(value) { 
            console.log(arguments.caller.name);
        }
    });
};

var foo = new MyClass;
foo.watchProperties();

foo.myproperty = 'bar';

这在功能上是相同的。我不知道为什么一个节点被阻止而另一个不被阻止,但这是节点6.0中的一个有效的解决方法。

答案 3 :(得分:-1)

您可以使用arguments.callee.caller来获取对来电者的引用。但是我相信它(仍然)已被弃用(尽管最终删除可能会导致某些情况出现问题,请参阅here进行讨论)并且您也错过了一些编译器/解释器优化。

示例:

function foo() {
  bar();
}

function bar() {
  console.log(arguments.callee.caller.name);
}

foo();

// outputs: foo