保存到会话的Sails.js模型会丢失自定义实例方法吗?

时间:2014-06-19 01:38:20

标签: node.js sails.js

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

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

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

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

它有效!为什么用户模型在将其保存到会话时会丢失此自定义方法(它是否被序列化?)

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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