gpt4 book ai didi

node.js - sails.js 在模型中使用 session 参数

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:23 25 4
gpt4 key购买 nike

这是 this question 的扩展.

在我的模型中,每个模型都需要在创建时设置 companyId,并且每个模型都需要通过同一 session 中的 companyid 进行过滤。

sails.js ,我已经阅读并理解 session 在模型中不可用,除非我使用 Controller 注入(inject)它,但是这需要我用非常非常重复的东西来编写我所有的 Controller / Action 。不幸的。

我喜欢 sails.js 并想进行转换,但谁能向我描述一个更好的方法?我希望我刚刚错过了一些东西。

最佳答案

因此,如果我理解正确的话,您希望在您的 Controller 中避免大量这样的代码:

SomeModel.create({companyId: req.session.companyId, ...})
SomeModel.find({companyId: req.session.companyId, ...})

很公平。也许您担心 companyId 将来会被重命名,或者需要进一步处理。如果您使用自定义 Controller 操作,最简单的解决方案是为接受请求作为参数的模型创建类方法:

SomeModel.doCreate(req, ...);
SomeModel.doFind(req, ...);

另一方面,如果您使用的是 v0.10.x,并且可以使用蓝图进行某些 CRUD 操作,您将受益于 override the blueprints with your own code 的能力。 , 这样您所有的创建和查找都会自动使用 session 中的 companyId

如果您来自非 Node 背景,这可能会引起一些挠头。 “为什么你不能让 session 随处可用?”你可能会问。 “就像他们在 PHP 中所做的那样!”

原因是 PHP 是无状态的——传入的每个请求本质上都是应用程序的一个新副本,请求之间不会共享内存中的任何内容。这意味着任何全局变量仅在单个请求的生命周期内有效。美妙的 $_SESSION 散列是你的,并且只属于你,一旦请求被处理,它就会消失。

将此与基本上在单个进程中运行的 Node 应用程序进行对比。您设置的任何全局变量都将在传入的每个请求之间共享,并且由于请求是异步处理的,因此无法保证一个请求会在另一个请求开始之前完成。所以很容易出现这样的场景:

  1. 请求 A 进来。
  2. Sails 获取请求 A 的 session 并将其存储在全局 $_SESSION 对象中。
  3. 请求 A 调用 SomeModel.find(),它异步调用数据库
  4. 当数据库发挥它的魔力时,请求 A 放弃了对 Node 线程的控制
  5. 请求 B 进来。
  6. Sails 获取请求 B 的 session 并将其存储在全局 $_SESSION 对象中。
  7. 请求 B 交出它对线程的控制以执行其他一些异步调用。
  8. 请求 A 返回其数据库调用的结果,并从 $_SESSION 对象中读取一些内容。

您可以在这里看到问题——请求 A 现在有错误的 session 数据。这就是为什么 session 对象存在于请求对象中,以及为什么它需要传递给任何想要使用它的代码的原因。太过努力地规避这一点将不可避免地导致麻烦。

关于node.js - sails.js 在模型中使用 session 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22853179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com