Node.js Nodejs&;mongoose:使用for循环检查数据是否存在,如果不存在,则插入数据库

Node.js Nodejs&;mongoose:使用for循环检查数据是否存在,如果不存在,则插入数据库,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试使用Goodreads API创建一个nodejs应用程序。当用户搜索书籍时,应用程序将获取goodreads查询搜索结果,并与本地mongodb数据库匹配,以检查书籍信息是否已在本地数据库中。如果没有,那么应用程序将获取每一本书的信息,并将它们保存到本地数据库中进行缓存。我的代码是这样的- goodreads.searchBook(req.query.query, function (err, res) { if(err) next(err); var result

我正在尝试使用Goodreads API创建一个nodejs应用程序。当用户搜索书籍时,应用程序将获取goodreads查询搜索结果,并与本地mongodb数据库匹配,以检查书籍信息是否已在本地数据库中。如果没有,那么应用程序将获取每一本书的信息,并将它们保存到本地数据库中进行缓存。我的代码是这样的-

goodreads.searchBook(req.query.query, function (err, res) {
    if(err) next(err);

    var resultObj = JSON.parse(res);

    var books = resultObj.GoodreadsResponse.search[0].results[0].work;

    // console.log(books[0].best_book[0].id[0]._);
    // console.log(books.length);

    // show only 6 books
    var maxLoop = 6;
    if (maxLoop > books.length) {
        maxLoop = books.length;
    }



    var i;
    for (i=0; i<maxLoop; i++) 
    {
        var goodreads_id = books[i].best_book[0].id[0]._;
        Book.findOne({goodreads_id : goodreads_id}, function(err,  res){
            if (err) next(err);

            if(res) {

                console.log('book is already in datastore');

            } else {

                // ERROR : goodreads_id is always the last one 
                // OURPUT: example -
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                console.log('no book found in database for goodreads ID ' + goodreads_id);
                goodreads.getBookInfo(goodreads_id, function(err, res){
                    if (err) next(err);

                    //console.log(res);

                    var resObj = JSON.parse(res);

                    var title = resObj.GoodreadsResponse.book[0].title[0];
                    console.log(title);
                });
            }
        });
    }
});   
goodreads.searchBook(req.query.query,函数(err,res){
如果(错误)下一个(错误);
var resultObj=JSON.parse(res);
var books=resultObj.GoodreadsResponse.search[0]。结果[0]。工作;
//console.log(书籍[0]。最佳书籍[0]。id[0]。\u);
//控制台。日志(书籍。长度);
//只展示6本书
var-maxLoop=6;
if(maxLoop>books.length){
maxLoop=books.length;
}
var i;

对于(i=0;i
Book.findOne
是异步的

当您到达回调函数时,甚至对于第一本书,您的循环已经完成

要解决此问题,可以使用承诺返回函数:

goodreads.searchBook(req.query.query, function (err, res) {
    if(err) next(err);

    var resultObj = JSON.parse(res);

    var books = resultObj.GoodreadsResponse.search[0].results[0].work;

    // console.log(books[0].best_book[0].id[0]._);
    // console.log(books.length);

    // show only 6 books
    var maxLoop = 6;
    if (maxLoop > books.length) {
        maxLoop = books.length;
    }

    // Promise-returning function
    var findBookPromise = function(goodreads_id){
        return Book.findOne({goodreads_id : goodreads_id}).then(function(res){
            if(res) {

                console.log('book is already in datastore');
                return Promise.resolve();

            } else {

                // ERROR : goodreads_id is always the last one
                // OURPUT: example -
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                console.log('no book found in database for goodreads ID ' + goodreads_id);
                return goodreads.getBookInfo(goodreads_id).then(function(res){
                    //console.log(res);

                    var resObj = JSON.parse(res);

                    var title = resObj.GoodreadsResponse.book[0].title[0];
                    console.log(title);

                    return res;
                }, next);
            }
        }, next);
    };

    var promises = []; // Create an array to store the promises

    var i;
    for (i=0; i<maxLoop; i++)
    {
        var goodreads_id = books[i].best_book[0].id[0]._;
        promises.push(findBookPromise(goodreads_id));
    }

    Promise.all(promises).then(function(books){
        // Do something with the results
    });
});
goodreads.searchBook(req.query.query,函数(err,res){
如果(错误)下一个(错误);
var resultObj=JSON.parse(res);
var books=resultObj.GoodreadsResponse.search[0]。结果[0]。工作;
//console.log(书籍[0]。最佳书籍[0]。id[0]。\u);
//控制台。日志(书籍。长度);
//只展示6本书
var-maxLoop=6;
if(maxLoop>books.length){
maxLoop=books.length;
}
//承诺返回函数
var findBookPromise=函数(goodreads\u id){
returnbook.findOne({goodreads\u id:goodreads\u id}).then(函数(res){
如果(res){
log('book已在数据存储中');
返回承诺。解决();
}否则{
//错误:goodreads\u id始终是最后一个
//乌尔普特:举例-
//在数据库中找不到ID为5的书籍
//在数据库中找不到ID为5的书籍
//在数据库中找不到ID为5的书籍
//在数据库中找不到ID为5的书籍
//在数据库中找不到ID为5的书籍
//在数据库中找不到ID为5的书籍
log('goodreads ID'+goodreads\u ID'在数据库中找不到书籍);
返回goodreads.getBookInfo(goodreads\u id)。然后返回(函数(res){
//控制台日志(res);
var resObj=JSON.parse(res);
var title=resObj.GoodreadsResponse.book[0]。title[0];
控制台日志(标题);
返回res;
},下一页);
}
},下一页);
};
var promissions=[];//创建一个数组来存储承诺
var i;

对于(i=0;iSo)您在这里真正想做什么?是“查找还是创建”给定一个数据列表?什么是
goodreads
及其方法?这是在联系某个远程API吗?如果是,那么重点是什么?您需要这里的其他信息吗?在循环中调用异步方法存在一个基本问题,该循环不等待这些方法调用完成后再进行迭代。但是仍然存在以下问题:ny design a method用法乍一看这里有缺陷。你的问题可以从解释这里提出的问题背后的原因中获益。我对问题进行了编辑,并做了更多解释。我希望这将有助于@NeilLunnI看到,除了
goodreads
方法正在做的事情之外,你在这里添加了很多内容。基本问题以下是1.你真的打算“查找或创建”行动吗?2.从goodreads获取数据的“意义”是什么?它是否需要用于创建的数据?我知道三个问题,但第二个问题是关于这两件事。goodreads是我的数据源(如书名、描述、isbn、评级等)我试图查看数据库中是否已有任何特定书籍的信息,如果没有,则将这些信息插入数据库,以便在需要时进行脱机和快速访问。@Neillunn需要插入哪些信息?这是我反复询问的问题。这只是数组中的信息吗?还是您正在从API添加数据?询问你需要弄清楚这一点,因为你的问题和当前的代码都不是。所以你基本上是在尝试“镜像”,对吗?但我们需要知道实际要“插入”哪些数据。它有很多问题,这是肯定的。承诺不是“万灵丹”,这只是另一种做事情的方法,而不是使用回调。因此,这仍然不能真正解决问题。
goodreads.searchBook(req.query.query, function (err, res) {
    if(err) next(err);

    var resultObj = JSON.parse(res);

    var books = resultObj.GoodreadsResponse.search[0].results[0].work;

    // console.log(books[0].best_book[0].id[0]._);
    // console.log(books.length);

    // show only 6 books
    var maxLoop = 6;
    if (maxLoop > books.length) {
        maxLoop = books.length;
    }

    // Promise-returning function
    var findBookPromise = function(goodreads_id){
        return Book.findOne({goodreads_id : goodreads_id}).then(function(res){
            if(res) {

                console.log('book is already in datastore');
                return Promise.resolve();

            } else {

                // ERROR : goodreads_id is always the last one
                // OURPUT: example -
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                // no book found in database for goodreads ID 5
                console.log('no book found in database for goodreads ID ' + goodreads_id);
                return goodreads.getBookInfo(goodreads_id).then(function(res){
                    //console.log(res);

                    var resObj = JSON.parse(res);

                    var title = resObj.GoodreadsResponse.book[0].title[0];
                    console.log(title);

                    return res;
                }, next);
            }
        }, next);
    };

    var promises = []; // Create an array to store the promises

    var i;
    for (i=0; i<maxLoop; i++)
    {
        var goodreads_id = books[i].best_book[0].id[0]._;
        promises.push(findBookPromise(goodreads_id));
    }

    Promise.all(promises).then(function(books){
        // Do something with the results
    });
});