【问题标题】:How to extend the functionality of blueprints in Sails.js without overriding the whole blueprint?如何在 Sails.js 中扩展蓝图的功能而不覆盖整个蓝图?
【发布时间】:2015-01-16 13:49:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript node.js sails.js waterline


    【解决方案1】:

    您可以在策略中设置参数。创建一个在 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
    }
    

    【讨论】:

    • 好吧,试过了,但它不起作用 - 我收到 Cannot set property 'user' of undefinedreq.options 似乎根本没有 where 属性,在 attachUser 策略中使用 console.log(req.where) 检查。 ://
    • 设法让它现在工作,改用req.query.user = req.session.userId
    • 您的方法可以工作,但如果有人在正文中附加 userId,req.query.user 会发生冲突。只需要注意这一点。如果简单地通过定义“where”对象来解决您的问题的解决方案。我在上面对其进行了编辑以反映这一点。
    • 有没有办法在蓝图路由的默认执行之后添加功能?我想“扩展”控制器返回的 ID 列表。问题:stackoverflow.com/questions/29254826/…
    【解决方案2】:

    如果你想扩展'find',例如:

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

    【讨论】:

    • 我们应该把这段代码放在哪里?我对它很感兴趣
    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 2016-11-12
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2015-12-18
    相关资源
    最近更新 更多