使用NodeJS

时间:2018-02-11 14:27:36

标签: javascript node.js mongodb mongoose

我正在尝试在NodeJS中为新闻阅读器应用编写一个后端。我们的想法是每隔几分钟检查一次RSS提要,将新项目保存到数据库,并在将新项目添加到数据库时向连接的用户发出事件。

我在编写保存到数据库的模块时遇到问题。期望的行为如下:

  1. 将已解析的RSS源(从最新到最旧的数组中排序)作为输入
  2. 对于每个项目,从最新的项目开始,尝试将其保存在数据库中
  3. 如果保存成功,请记录'保存成功'到控制台并尝试下一个项目
  4. 如果保存失败,因为该项目已存在于数据库中,请停止运行该模块。
  5. 已配置数据库模型,因此当我尝试保存已存在的项目时,数据库会拒绝它。但是,下面的代码从不记录成功的保存,如果我删除数据库,它只保存第一个文档,然后给我一个重复的键错误。

    知道我做错了吗?

    // Module
    
    var { mongoose } = require('../db/mongoose');
    var { Item } = require('../models/item');
    var { scrape } = require('./scrape')
    var { parse } = require('./parse')
    
    var updateNewsDatabase = function() {
        return new Promise((resolve, reject) => {
            console.log('Scraping now')
            scrape().then((rssFeeds) => {
                var output = parse(rssFeeds);
                saveEachNewsItem(output)
                    .catch((e) => {
                        console.log('Error:', e);
                        resolve()
                    })
            })
        });
    }
    
    async function saveEachNewsItem(newsItems) {
        for (let item of newsItems) {
            console.log('Attempting to save document')
            var itemToSave = new Item(item);
            await itemToSave.save()
                .then((err, docs) => {
                    if (docs) {
                        console.log('Saved document to database')
                    }
                    if (err) {
                        throw new Error(err)
                    }
                });
        }
    }
    
    module.exports = { updateNewsDatabase }
    

1 个答案:

答案 0 :(得分:0)

在代码的这一部分中,您抛出异常并使其停止for循环。

await itemToSave.save()
        .then((err, docs) => {
            if (docs) {
                console.log('Saved document to database')
            }
            if (err) {
                throw new Error(err)
            }
        });