2016-04-09 15 views
1

私はマングースに少し問題があります。私はオンラインのRSSフィードからデータを取得し、解析し、それを配列に渡します。そこからマングースモデルをフィードします。これはgetルートで起こります、私が達成したいのは、最初にすべてのデータをmongooseモデルから削除し、それに新しいデータを設定することですが、パーサーが数回反復するので、常にデータをまとめて削除するか、何も削除されず、データはモデルに追加され続けるだけです。マングースを削除してルートを作成する

は、ここでは、このの

'use strict'; 
const Promise = require('bluebird'); 
const request = require('request'); 
const FeedParser = require('feedparser'); 
const express = require('express'); 
const router = express.Router(); 
const xray = require('x-ray')(); 
var Post = require('../models/post'); 
var dataArray = []; 

router.get('/', function (req, res) { 

    const fetch = (url) => { 

     return new Promise((resolve, reject) => { 
      if (!url) { 
       return reject(new Error(`Bad URL (url: ${url}`)); 
      } 

      const feedparser = new FeedParser(); 
      const items = []; 

      feedparser.on('error', (e) => { 
       return reject(e); 
      }).on('readable',() => { 
       // This is where the action is! 
       var item; 
       console.time('loading') 
       while (item = feedparser.read()) { 
        items.push(item); 
       } 
      }).on('end',() => { 
       resolve({ 
        meta: feedparser.meta, 
        records: items 
       }); 
      }); 

      request({ 
       method: 'GET', 
       url: url 
      }, (e, res, body) => { 
       if (e) { 
        return reject(e); 
       } else if (res.statusCode != 200) { 
        return reject(new Error(`Bad status code (status: ${res.statusCode}, url: ${url})`)); 
       } 
       feedparser.end(body); 
       feedparser.on('end', function() { 
        console.log('Done'); 
       }); 
      }); 
     }); 
    }; 

    Promise.map([ 
      'url', 
      'url',        
      'url', 
      'url'], (url) => fetch(url), { concurrency: 4 }) // note that concurrency limit 
     .then((feeds) => { 
      feeds.forEach(feed => { 
       feed.records.forEach(record => { 
        dataArray.push(record); 
       }); 
      }); 
     }).catch(function (error) { 
      console.log(error); 
     }); 

    Post.remove({}, function (err) { 
     if (err) { 
      console.log(err); 
     } else { 
      console.log('collection removed'); 
     } 
    }); 

    dataArray.forEach(post => { 
     Post.create({ 
      title: post.title, 
      content: post.description, 
      created: post.date, 
      image: post['rss:image']['#'], 
      link: post.link 
     }, function (err, newPost) { 
      console.log(newPost.title); 
     }); 
    }); 
    Post.find({}, function (err, posts) { 
     if (err) { 
      console.log(err); 
     } else { 
      res.render('index/home', { 
       posts: posts 
      }); 
     } 
    }); 
}); 


module.exports = router; 

答えて

1

どれも同期的に実行しようとしていない私のコードです。あなたは次のような何かをすることができます:

'use strict'; 
const Promise = require('bluebird'); 
const request = require('request'); 
const FeedParser = require('feedparser'); 
const express = require('express'); 
const router = express.Router(); 
const xray = require('x-ray')(); 
var Post = require('../models/post'); 
var dataArray = []; 
const fetch; 

router.get('/', function (req, res) { 

Post.remove({}, function (err) { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log('collection removed. Starting to fetch Posts from Service'); 
     fetch = (url) => { 
      return new Promise((resolve, reject) => { 
       if (!url) { 
        return reject(new Error(`Bad URL (url: ${url}`)); 
       } 

       const feedparser = new FeedParser(); 
       const items = []; 

       feedparser.on('error', (e) => { 
        return reject(e); 
       }).on('readable',() => { 
        // This is where the action is! 
        var item; 
        console.time('loading') 
        while (item = feedparser.read()) { 
         items.push(item); 
        } 
       }).on('end',() => { 
        resolve({ 
         meta: feedparser.meta, 
         records: items 
        }); 
       }); 

       request({ 
        method: 'GET', 
        url: url 
       }, (e, res, body) => { 
        if (e) { 
         return reject(e); 
        } else if (res.statusCode != 200) { 
         return reject(new Error(`Bad status code (status: ${res.statusCode}, url: ${url})`)); 
        } 
        feedparser.end(body); 
        feedparser.on('end', function() { 
         console.log('Done'); 
        }); 
       }); 
      }); 
     }; 
    } 
}); 

Promise.map([ 
     'url', 
     'url',        
     'url', 
     'url'], (url) => fetch(url), { concurrency: 4 }) // note that concurrency limit 
    .then((feeds) => { 
     feeds.forEach(feed => { 
      dataArray = dataArray.concat(feed.records); 
      /*feed.records.forEach(record => { 
       dataArray.push(record); 
      });*/ 
     }); 
     console.log('inserting posts in the collection'); 
     dataArray.forEach(post => { 
      Post.create({ 
       title: post.title, 
       content: post.description, 
       created: post.date, 
       image: post['rss:image']['#'], 
       link: post.link 
      }, function (err, newPost) { 
       console.log(newPost.title); 
      }); 
     }); 

     console.log("Fetching posts from the collection"); 
     Post.find({}, function (err, posts) { 
      if (err) { 
       console.log(err); 
      } else { 
       res.render('index/home', { 
        posts: posts 
       }); 
      } 
     }); 

    }).catch(function (error) { 
     console.log(error); 
    }); 
}); 


module.exports = router; 

私はこれをテストしていません。あなたの最後にそれをテストしてください。エラーや何かがある場合は教えてください。

+0

あなたはイベントのことを詳しく説明できますか?私はあなたのソリューションを試しましたが、それは私が最初に話したのと同じことをやっています。それは、リフレッシュするたびにコレクションに追加し続けます。私が達成しようとしているのは、すべてのデータを削除し、Promise.mapの後にもう一度追加するだけです。 –

+0

最初に 'Post'コレクションからアイテムを削除してから、サービスにアクセスして投稿データを取得し、そのデータを' Post'コレクションに追加する必要がありますか?私たちは最初にサービスからデータを取得してから、 'Post'コレクションからすべての投稿を削除してから、投稿を再度追加しています。 –

+0

はい、何か起こる前にすべてのアイテムをコレクションから削除してから、コレクションをサービスに再度追加します。 –

関連する問題