如何在不覆盖整个蓝图的情况下扩展 Sails.js 中蓝图的功能?

How to extend the functionality of blueprints in Sails.js without overriding the whole blueprint?

我有一个问题无法找到答案,尽管我觉得这种功能在 Web 应用程序中很常见。我对 sails.js 和一般的 Web 开发还很陌生,所以如果我使用了错误的术语或其他内容,请随时纠正我。

我正在尝试更改 sails.js 蓝图的默认功能,特别是 'find' 初学者。我有一个模型,我们称它为 Book,它有一个属性 'user',这当然与用户有关。我想过滤来自 localhost:[port]/book 的结果,这样它只显示所有者是当前登录用户的书籍,而不是显示数据库中的所有书籍。

到目前为止,我已经尝试检查策略是否是答案,但它们似乎产生非常二元的 'yes/no' 结果并且不能用于过滤。然后我尝试覆盖 BookController 的默认查找操作,这种方法可行,但恐怕我覆盖了一些有用的功能,因为我不完全理解蓝图的源代码。然后我检查了答案 Adding missing request parameter before persistance in Sails.JS,并尝试将所有者添加为 URL 查询参数,但发现我无法从 routes.js 访问当前登录的用户和想法反正从一开始就注定了。

无论如何,我想知道是否有处理这个问题的聪明方法。

您可以在策略中设置参数。创建一个在 bookController.find 上运行的策略并让它添加用户 ID

示例(取决于您的设置)

req.options.where.user = req.session.userId

然后当您的蓝图运行时,它会将用户 ID 与参数中传递的其他查询属性合并。

这是一个入门示例。您可以扩展此方法以在创建和更新时自动附加用户

config/policies.js

module.exports.policies = {'book.find':'attachUser'}

api/policies/attachUser.js

module.exports = function(req, res, next) {
    if(!req.options.where) req.options.where = {};
    req.options.where.user = req.session.userId
}

如果您想扩展 'find' 例如:

    find: function(req, res) {
        console.log("I am extended functionality")
        return sails.hooks.blueprints.middleware.find(req, res)
    }