将数据保存到MongoDB时返回非空值的功能无法正常运行

时间:2018-09-06 18:09:03

标签: javascript node.js mongodb mongoose

我从API调用中获得了一个对象数组,然后根据两个键:story_titletitle来过滤值。如果两个值都为null,则将过滤对象。然后,我遍历过滤后的对象数组,以将某些数据从过滤后的数组保存到mongodb(使用mongoose)。问题是我想用一个title键保存文档,所以我创建了一个函数来检查story_titletitle是否为空并返回非空值。

该函数无法正常运行,因为title循环内的for中的函数返回了一些null值。

function pickTitle(title, story_title) {
    if (!story_title) {
        return story_title;
    } else {
        return title
    }
}

everyHour: async () => {
        try {
            data = await axios.get(url);
            let posts = data.data.hits;
            const filteredPosts = await posts.filter((elem) => {
                return (!elem.title || !elem.story_title)
            });

            for (let filtered of filteredPosts) {
                Post.updateOne({
                    _id: filtered.objectID,
                    author: filtered.author,
                    title: await pickTitle(filtered.title, filtered.story_title),
                    created_at: filtered.created_at,
                    },
                    {$setOnInsert: filtered}, 
                    {upsert: true}, 
                    function(err, numAffected) {
                        if (err) {
                            //console.log("err")
                        } else {
                            //console.log(numAffected)
                        }
                    })
                    .then(res => {
                        //console.log(res)
                    })
                    .catch(err => {
                        //console.log(err)
                    });
            }
        } catch(error) {
            console.log(error);
        }
    }

1 个答案:

答案 0 :(得分:0)

这里有一些问题。我将在代码中的一些注释中逐步介绍它们,并将“解决方案”直接放在注释的代码下方。

  • 您正在等待非异步的呼叫...请不要这样做。 Array.filter不是异步操作
  • 您的函数<template> <button @click="showHideAge=!showHideAge">Show/Hide Age</button> <b-table striped hover :items="items"></b-table> </template> <script> const items = [ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' }, { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' }, { isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' }, { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' } ] export default { data () { return { items: items, showHideAge: true } } } </script> 是非异步的,正在pickTitle
  • 您的解决承诺在一个循环内,通常被认为是不好的做法。将您的诺言添加到数组中,并使用await
  • 解析每个人
  • 最后,您的“过滤器”逻辑对NULL Promise.all()title进行过滤。这意味着只有一个需要成立。两者都可能为NULL。因此,如果两个函数都为NULL,则story_title函数将返回空值。如果您希望始终至少有 其中一个包含一个值,则需要更改array.filter的工作方式。

pickTitle