Sails.js - 如何跨多个控制器操作重用(大多数)此代码?

时间:2014-12-16 01:32:18

标签: node.js model-view-controller sails.js

我使用特定的npm模块抓取Feed,我想要做的是使用相同的代码创建多个动作,尽管我不想重复整个代码。这是我的控制者:

module.exports = {

    buzzy: function (req, res) {
        var FeedParser = require('feedparser'),
            request = require('request');

        var req = request('http://rss.nytimes.com/services/xml/rss/nyt/Technology.xml'),
            feedparser = new FeedParser();

        req.on('error', function (error) {
            // handle any request errors
        });
        req.on('response', function (res) {
            var stream = this;

            if (res.statusCode != 200) return this.emit('error', new Error('Bad status code'));

            stream.pipe(feedparser);
        });


        feedparser.on('error', function (error) {
            // always handle errors
        });
        feedparser.on('readable', function () {
            // This is where the action is!
            var stream = this,
                meta = this.meta // **NOTE** the "meta" is always available in the context of the feedparser instance
                ,
                item;

            while (item = stream.read()) {
                var newData = item;                        
                   Buzzfeed.create({'title': newData.title, 'url': newData.link, 'source': 'nytimesTech', 'category': 'tech'}, function (err, newTitles) {
                        });                       

            }
        });

    }
};

非常类似于' buzzy'控制器动作,我想创建多个动作 - 以下是每个控制器中唯一的行

var req = request('http://rss.nytimes.com/services/xml/rss/nyt/Technology.xml'),

Buzzfeed.create({'title': newData.title, 'url': newData.link, 'source': 'nytimesTech', 'category': 'tech'}, function (err, newTitles) {
                            });  

好奇,实施这个的最佳方法是什么,所以我不重复?

2 个答案:

答案 0 :(得分:3)

您可以使用服务。如果您在代码中的多个位置使用了函数,则可以使用它们。

请参阅此处的文档:Services

答案 1 :(得分:3)

/api/services文件夹中,创建一个文件,将其命名为BuzzyAPI.js(比如说​​),然后添加以下代码:

var FeedParser = require('feedparser'),
request = require('request');

module.exports = {

  buzzy: function (reqUrl) {

    var req = request(reqUrl),
    feedparser = new FeedParser();

    req.on('error', function (error) {

    });
    req.on('response', function (res) {
      var stream = this;
      if (res.statusCode != 200) return this.emit('error', new Error('Bad status code'));
      stream.pipe(feedparser);
    });
    feedparser.on('error', function (error) {

    });
    feedparser.on('readable', function () {
      var stream = this,
      meta = this.meta,
      item;
      while (item = stream.read()) {
        var newData = item;                        
        Buzzfeed.create({'title': newData.title, 'url': newData.link, 'source': 'nytimesTech', 'category': 'tech'}, function (err, newTitles) {

        });
      }
    });    
  }
};

现在,您可以从任何Service拨打controller,并使用以下内容提供所需的URL

BuzzyAPI.buzzy(url);

希望这有帮助。