node.js - Mongoose 在 get 路由中删除和创建

标签 node.js mongodb

我对 mongoose 有一个小问题,我正在做的是从在线 rss feed 获取数据,解析它,并将其传递到一个数组,我从中提供一个 mongoose 模型,所有这些都发生在 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;

最佳答案

这一切都不会同步运行。你可以做这样的事情:

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

我还没有测试过这个。请在你这边测试一下。如果有错误或其他问题请告诉我。

关于node.js - Mongoose 在 get 路由中删除和创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515484/

相关文章:

python - 在同一目录中导入对象时出现问题

mongodb - MongoDB : Get all documents inserted after the last known one

python - pymongo:删除重复项( map 减少?)

Node.js Amazon S3 - 下载失败并出现 SignatureDoesNotMatch 错误

Node.js 全局自定义 require 函数

javascript - 无法理解复杂的 $group'ing/aggregation

javascript - 删除集合中旧消息/帖子的最佳方法?

javascript - 从node.js控制台程序连接到socket.io node.js服务器

node.js - Nodejs Bookshelf 中的简单引用关系

javascript - 身份验证的架构和思考