2016-04-09 24 views
1

Mongoose ile ilgili küçük bir sorunum var, yaptığım şey çevrimiçi rss feed'lerinden veri alıyor, ayrıştırıyor ve bir mongoose modelini beslediğim bir diziye aktarıyor ve Bu, rotada gerçekleşir, gerçekleştirmek istediğim şey, önce tüm verileri mongoose modelinden siler ve daha sonra yeni verilerle doldurur, ancak ayrıştırıcı birkaç kez yinelediği için her zaman verileri bir arada siler. Hiçbir şey silmez ve veriler modele eklemeye devam eder.Mongoose kaldır ve rotada oluştur

İşte bu

'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; 

cevap

1

Yok eşzamanlı çalıştırmak için gidiyor benim kod. Bunun gibi bir şey yapabilirsiniz: Bunu test etmedim. Lütfen sonuna kadar test et. Bir hata veya bir şey varsa bana bildirin.

+0

Etkinlik olayını detaylandırır mısınız? Çözümünüzü denedim ama yine de orijinal olarak konuştuğum aynı şeyi yapıyor, her yenilendiğimde koleksiyona eklemeye devam ediyor. Tamamlamaya çalıştığım şey, tüm verileri kaldırıp Promise.map'ten sonra tekrar eklemeniz, sayfayı yeniledikten sonra olması gereken tek şey. –

+0

İlk önce 'Post' koleksiyonundaki öğeleri kaldırmanız, ardından servise basmanız ve mesaj verisini almanız ve ardından verileri 'Post' koleksiyonuna eklemeniz gerekiyor mu? Coz şu anda önce verileri hizmetten alıyoruz, daha sonra "Post" Koleksiyonundaki tüm mesajları kaldırıyoruz ve daha sonra bu mesajları tekrar gönderiyoruz. –

+0

Evet, koleksiyondaki tüm öğeleri bir şey olmadan önce kaldırmak istiyorum, ardından bunları hizmet aracılığıyla tekrar koleksiyona ekleyin. –