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

时间:2015-01-16 13:49:38

标签: javascript node.js sails.js waterline

我遇到了一个无法找到答案的问题,即使我觉得这种功能在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访问当前登录的用户,这个想法可能从一开始就注定失败反正。

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

2 个答案:

答案 0 :(得分:2)

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

示例(取决于您的设置)

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

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

这是一个初步的例子。您可以将此方法展开为自动附加用户以及创建和更新

<强>配置/ 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
}

答案 1 :(得分:0)

例如,如果要扩展“查找”:

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