我有一个依赖于function.caller的任务来完整性地检查调用者是否被授权。
根据这个网址,所有主流浏览器都支持来电...我的所有单元测试都通过了:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
但是,nodejs拒绝所有访问function.caller的尝试(将其报告为null)。
我愿意接受有关在nodejs上工作的建议......我不想让这个框架只适用于浏览器。
谢谢!
答案 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