【问题标题】:Getting code from callback or storing callbacks in Javascript (Node.js)从回调中获取代码或在 Javascript (Node.js) 中存储回调
【发布时间】:2017-06-28 17:05:43
【问题描述】:

我正在尝试将回调存储在我的数据库中,并稍后在另一个会话中使用它们。

有可能吗?

让我们编写一些代码,例如:

// One session
var callback = () => {
  console.log("Hey! This is a callback!");
}

db.store("myCallback", callback);

// Another session
db.get("myCallback")(); // Output: "Hey! This is a callback!"

编辑 - 只是为了澄清我的上下文,我们可以参考这个问题:Question

【问题讨论】:

  • 我不认为它是一个可序列化的对象......它变成了像[Object Object]这样的字符串......就是这样...... :(
  • @EvgenyKolyakov 我知道它不可序列化,但我仍然找到了实现它的方法。谢谢!
  • 另外,先试试console.log(db.get("myCallback")); ..
  • @EvgenyKolyakov 我很确定它应该打印“[Function]”
  • 有了这个特殊的例子,你可以稍后callback.toString()eval,但是它将在不同的上下文中执行,所以几乎不能用于比console.log更复杂的东西;

标签: javascript node.js function callback store


【解决方案1】:

您可以使用 javascript Function 类。

正如 Alex Blex 所说,要实现这一点,您必须将每个回调作为 javascript 代码字符串存储在数据库中,然后将其作为字符串检索。您将其作为 Function(...) 构造函数的参数传入。

话虽如此,这不是一种非常有效的做事方式。如果你能把函数的结果存到数据库里,那会节省很多空间。

【讨论】:

  • 听起来是个好主意(当然它有安全弱点,但这取决于使用情况)。关于您的第二个建议,您可以看到我在问题中添加的参考资料,也许这会为您提供一些关于我正在尝试实施的信息。
  • 好的,那么你应该考虑 theRemix 的答案。存储函数的参数,而不是函数本身。
  • 记得转义字符,这样当您将其作为参数插入时用户无法注入更多代码
  • 但是我们被限制为“虚拟”功能......我们如何才能逃避字符?
  • 什么意思?并查看this question 以防止脚本注入
【解决方案2】:

如果回调函数不同,最好存储部分。

var callbackParams = { 
  message : "Hey! This is a callback!"
}
db.store("myCallback", callbackParams); 
// Another session 
var handleCallback = (params) => {
    console.log(params.message);
}
handleCallback(db.get("myCallback"));

最糟糕的方法是使用eval。不要使用eval,因为它很容易被利用,使您的程序和系统容易受到攻击。

【讨论】:

  • 这个解决方案的问题是我们被限制为虚拟的console.log回调,不是吗?
  • 这是一个例子。基本上你想将 data 存储在 db 中,而不是 functionality。检索数据后,您可以根据需要在定义的函数中处理它。
【解决方案3】:

如果你有这样的事情,我会做场景:

var myObj = new function() {
  // One session
  this.callback1 = () => {
    console.log("Hey! This is a callback1!");
  }
  this.callback2 = () => {
    console.log("Hey! This is a callback2!");
  }
}();



db.store("myCallback", "callback1");

// Another session
myObj[db.get("myCallback")](); // Output: "Hey! This is a callback1!"

【讨论】:

  • 我不明白你为什么要这么做。窗口为什么要在他的原型中再次出现这个回调?
  • 你可以使用智能词,或者只是将任何函数分配给 JS 中的任何对象。
  • 但在其他会话中,窗口中不应该有回调。
  • 我知道你说window是什么意思,但我还是不明白为什么你认为回调会在秒会话中再次出现在对象中,因为如果回调不可序列化,序列化myObj 不会序列化回调,因此第一个会话中的myObj 与第二个会话中的myObj 不同。
  • 您需要将代码存储在代码中,数据存储在数据库中。将代码存储在数据库中是不好的做法...如果明天您决定更改代码中的某些内容..现在,您需要在数据库中的任何地方更改它...而不仅仅是上传新脚本。
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 2015-07-15
相关资源
最近更新 更多