【问题标题】:Calling super method in sails.js controller在sails.js 控制器中调用超级方法
【发布时间】:2013-08-09 05:39:04
【问题描述】:

当我在sails.js 中创建一个控制器并重新定义了一些标准方法时,我如何调用这个控制器的默认父方法?

module.exports = {
    create: function(req, res) {
        //test some parameters   
        if (condition) {
            //call regular super method, proceed as usual
            //_super(); <- how to do this?
        } else {
            //do some other things
        }
    }
};

【问题讨论】:

  • 这个默认的父方法会存在哪里?您似乎没有在这里覆盖任何东西,只是定义了一个 create 控制器路由。
  • Sails.js 为控制器中的 create 方法提供了自己的实现。如果我们不定义它,它照常工作——只是构建模型并将其保存到数据库中。问题是如何调用这个默认实现。
  • 你有没有想过这个问题?
  • 就像 Mike 说的,你可以尝试调用 next() (控制器动作的第三个参数)。它对我不起作用(v0.9.3),但对于较新的版本它可以工作。我的解决方案是复制默认行为。因为只有几行,所以问题不大。

标签: javascript node.js inheritance sails.js


【解决方案1】:

更新: 对于 Sails >= v0.10.x,请参阅来自 @naor-biton 的 the comment below

如果您想访问默认实现(蓝图),从 v0.9.3 开始,您可以调用 next()(控制器的第三个参数)。这是因为 Sails 基于中间件的 Express/Connect 概念,允许您将事物链接在一起。

请注意,此行为可能会在后续版本中发生变化,因为next() 也是您为没有蓝图的操作调用默认 404 处理程序 (config/404.js) 的方式。

如果您对使用蓝图感兴趣但事先运行一些逻辑,更好的方法是不定义控制器操作并使用一个或多个策略,这些策略将预先运行。

【讨论】:

  • 顺便说一句,它没有按预期工作。当我使用空控制器时,POST 请求成功创建了一个模型。但是当我使用这样的东西时,什么也没有发生,并且返回了空响应。 module.exports = { create: function(req, res, next) { next(); } };
  • 所以这不再适用于sails .10,那么策略真的是处理这个问题的最佳方式吗?
  • 要求默认蓝图并调用它们怎么样? var create = require('sails/lib/hooks/blueprints/actions/create'); ... create: function (req, res) { /* Do some stuff... */ create(req, res); }
  • @NaorBiton 谢谢你的想法,你救了我。
  • 这个答案有新的更新吗?没有一个答案对我有用。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 2011-08-11
  • 2017-10-21
  • 2012-03-26
  • 2015-07-05
相关资源
最近更新 更多