繁体   English   中英

sails.js从控制器方法访问控制器方法

[英]sails.js access controller method from controller method

为什么你不能从另一个控制器方法中访问其他控制器方法呢?

像这样。

module.exports = 

   findStore: ->
       # do somthing

   index: ->
      @findStore(); # Error: undefined

编译

module.exports = {
  findStore: function() {},
  index: function() {
    return this.findStore(); // Error: undefined
  }
};

如果你不能这样做,为什么不呢? 我怎么能这样做......

你可以使用sails.controllers.yourControllerName.findStore()

sails全局对象几乎引用了所有内容。

在Sails中组织代码的最佳方法之一,至少对我和我的团队来说,一直是在服务(/ api / services)中拥有所有真正的业务逻辑。 可以从任何控制器全局访问这些对象。

此外,一个好的做法是使用服务中的promise(因为Sails在模型方法上使用它们)

只需使用您的代码创建Store服务(StoreService.js):

module.exports = {
  findStore: function(storeId) {
    // here you call your models, add object security validation, etc...
    return Store.findOne(storeId);
  }
};

您的控制器应处理与请求,调用服务和返回适当响应相关的所有内容。

例如,在您的示例中,控制器可以具有以下内容:

module.exports = {
  index: function(req, res) {
    if(req.param('id')) {
      StoreService.findStore(req.param('id'))
        .then(res.ok)
        .catch(res.serverError);
    } else {
      res.badRequest('Missing Store id');
    }
  },
  findStore: function(req, res) {
    if(req.param('id')) {
      StoreService.findStore(req.param('id'))
        .then(res.ok)
        .catch(res.serverError);
    } else {
      res.badRequest('Missing Store id');
    }
  },
};

这样,您就拥有了非常简单的控制器,并且所有业务逻辑都由服务管理。

过去几个小时遇到同样的问题。 我使用了api / services文件夹。 它可能不是您需要的,但它是一个选项。 这里有一个很好的解释。 将哪些服务添加到sails.js中的api / services文件夹中

当你只是想快速构建一些东西时,它有点烦人,但从长远来看,它会强制实施良好的代码组织实践(通过将所有业务逻辑推入控制器变得更加困难)。

我想建议一个有效的解决方案,但不是最好的方法。 我们可以使用bind函数将上下文与调用源绑定,如下所示:

generateUrl存在于控制器A中

function generateUrl(){
  return 'www.google.com';
}

获取URL是Controller A中的另一种方法

getURL(){
  A.generateURL.bind(A.generateURL) //func call with optional arg
}

我希望这有帮助!

解决此问题的一种更优雅的方法是在函数名之前使用关键字this

例:

one: function() {
   console.log('First Function');
},

two: function() {
   // call the function one in the same controller
   this.one();
}

你可以这样做:

//ArticleController
module.exports = {
  findStore: async () => {
    return await findStoreFunc(req.param('id'));
  },
  index: async () => {
    ...
    return await findStoreFunc(id);
  }
};

const findStoreFunc = async (id) => {...}

并使用另一个控制器的功能:

const ArticleController = require('./ArticleController');
//CustomerController
module.exports = {
  index: async () => {
    ...
    let article = await ArticleController.findStore(id);
    ...
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM