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

问题描述 投票:3回答:2

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

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

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

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

javascript node.js sails.js waterline
2个回答
2
投票

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

示例(取决于您的设置)

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

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

这是一个开始的例子。您可以展开此方法以在创建和更新时自动附加用户

配置/ policies.js

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

API /政策/ attachUser.js

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

0
投票

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

    find: function(req, res) {
        console.log("I am extended functionality")
        return sails.hooks.blueprints.middleware.find(req, res)
    }
© www.soinside.com 2019 - 2024. All rights reserved.