【问题标题】:Sails.js model saved to session loses custom instance methods?Sails.js 模型保存到会话丢失自定义实例方法?
【发布时间】:2014-06-19 01:38:20
【问题描述】:

在我的用户模型上,我有一个自定义实例方法getEarnings(),它只是在文档中添加了一些其他字段。我正在尝试调用此方法并从我的视图模板中显示它,如下所示,使用登录后先前保存到会话中的用户对象:

<div>
 Your earnings are <%= req.session.user.getEarnings() %>
</div>

这不起作用,sails 告诉我 getEarnings 在该对象上不存在。但是,如果我从控制器中检索用户对象(使用 User.findOne(...)),然后将该对象传递给视图参数,我可以执行以下操作

<div>
 Your earnings are <%= user.getEarnings() %>
</div>

它有效!为什么 User 模型在保存到会话时会丢失这个自定义方法(是否正在序列化?)

请注意这个例子是人为的,我是全新的风帆,我真的只是想知道这个特定问题的答案(即我知道我可以从控制器设置 req.session.user.earnings 来修复这个具体问题)。

【问题讨论】:

  • 您能否显示将user 保存到会话的代码?

标签: node.js sails.js


【解决方案1】:

当您在会话中存储内容时,它将运行JSON.stringify(values),这将从对象中剥离函数。

【讨论】:

  • 要重新添加它们,您可以...?
  • 我怀疑有许多 X.extend 函数之一可以实现这一点,但我不确定第二个参数是什么。我尝试了几件事无济于事。
  • @josh-liptzin 你能解决这个问题吗?我没有在会话中存储变量,但我仍然无法让模型的自定义属性函数工作。我也尝试过覆盖toJSON(){ var obj = this.toObject(); obj.myCustomFunc = this.myCustomFunc; },但没有运气。
【解决方案2】:

正如@particlebanana 所说,当您将用户模型存储在 req.session.user 中时,您只能在此请求期间拥有它。之后,用户模型保存在 req.session.user 中,但是是 JSON 格式。这意味着您已经失去了拥有具有“属性”和“方法”的模型“对象”的所有魔力。在下一个请求中,您将只有 json 格式的 User 模型的“属性”。

此外,如果在 User 模型中覆盖了 toJSON() 默认方法,则只有新的 toJSON 方法返回的属性可用。

如果您希望在每个请求中都有一个用户模型,目的是使用内部声明的函数,则必须使用存储在 req.session.user.id 中的 id 从数据库中检索模型本身。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2019-10-18
    • 1970-01-01
    • 2015-11-13
    • 2019-10-20
    • 2012-11-22
    相关资源
    最近更新 更多