如何在节点js中使用增量数据执行文件写入?

时间:2017-06-19 05:10:00

标签: javascript node.js mongoose mean-stack fs

我有一个包含80个项目的列表,每个页面上有10个项目。现在我的想法是将所有数据写入文件,前10个将在一个文件中然后接下来10个在另一个文件中在我得到每页80个博客10个页面的8页。问题是我只得到一个文件与10个博客写了什么关于else.Can任何人请找到错误。谢谢。为此,我写了脚本为如下,

我发现循环没有增加。

exports.getBlogsTest = function(req, res) {
    helper.logs('getBlogs', 'blog');
    var pages = ['undefined', '2', '3', '4', '5', '6', '7', '8'],
        pageNum = '';
    pages.forEach(function(i, v) {
        try {
            var currentPage = Number(i);
            var itemsPerPage = 10;
            var startItem = (currentPage - 1) * itemsPerPage;
            async.waterfall([
                    function(done) {
                        try {
                            if (currentPage === 1) {
                                blogs.count().exec(function(err, count) {
                                    if (err) {
                                        helper.logs('getBlogs', 'blog', err, 'console');
                                        throw err;
                                    } else {
                                        done(err, count);
                                    }
                                });
                            } else {
                                done('', 'page');
                            }
                        } catch (e) {
                            helper.logs('getBlogs', 'blog', e.message);
                        }
                    },
                    function(count, done) {
                        try {
                            if (count) {
                                if (count && count !== 'page') {
                                    res.setHeader('totalItems', count);
                                }
                                blogs.find().sort({ date: -1 }).select('-text').skip(startItem).limit(itemsPerPage).exec(function(err, data) {
                                    if (err) {
                                        helper.logs('getBlogs', 'blog', err, 'console');
                                        throw err;
                                    }
                                    if (data && data.length > 0) {
                                        res.send(data);
                                        console.log('reached@@@@@@@@@@@@@@@@@@@')
                                        if (i === 'undefined') {
                                            pageNum = '';
                                        } else {
                                            pageNum = i;
                                        }
                                        var fileName = 'public/amp/test2/amp-blog-list' + pageNum + '.html';
                                        var modData = data;
                                        fs.writeFile(fileName, modData, function(err) {
                                            if (err) {
                                                return console.log(err);
                                            }
                                            console.log("The file was saved!");
                                        });
                                    } else {
                                        res.send([]);
                                    }
                                });
                            } else {
                                res.send([]);
                            }
                        } catch (e) {
                            helper.logs('getBlogs', 'blog', e.message);
                        }
                    }
                ],
                function(err) {
                    helper.logs('getBlogs', 'blog', err, 'console');
                    throw err;
                });
        } catch (e) {
            helper.logs('getBlogs', 'blog', e.message);
        }
    })

};

1 个答案:

答案 0 :(得分:0)

你为什么要使用这么多try catch? 虽然它在许多情况下可能有用,但在没有必要时应避免使用它。

您遇到问题的几点:

  • var currentPage = Number(i); 当我不确定时#39; currentPage === NaN
  • {li>与var startItem = (currentPage - 1) * itemsPerPage;相同 当currentPage是' NaN' startItem === NaN

我猜你认为forEach中的参数是(索引,值),但它是反过来的(值,索引)

我尝试过一段时间来改进你的代码,但实际上还没有运行它。

exports.getBlogsTest = function(req, res) {
    helper.logs('getBlogs', 'blog');

    var itemsPerPage = 10;

    for (var i = 1; i < 11; i++) { // pages 1-10

        (function(currentPage){ // currentPage = i

            var startItem = (currentPage - 1) * itemsPerPage;

            async.waterfall([
                function(done) {
                    if (currentPage === 1) {
                        blogs.count().exec(function(err, count) {
                            if (err) {
                                helper.logs('getBlogs', 'blog', err, 'console');
                                //throw err;
                                done(err); // the done callback will be called with the error
                            } else {
                                done(null, count); // no error so send null
                            }
                        });
                    } else {
                        done(null, 'page'); // no error so send null
                    }
                },
                function(count, done) {
                    if (count) {
                        if (count !== 'page') {
                            res.setHeader('totalItems', count);
                        }
                        blogs.find().sort({ date: -1 }).select('-text').skip(startItem).limit(itemsPerPage).exec(function(err, data) {
                            if (err) {
                                helper.logs('getBlogs', 'blog', err, 'console');
                                done(err); // you never called done 
                                //throw err;
                            }
                            if (data && data.length > 0) {
                                res.send(data);

                                var fileName = 'public/amp/test2/amp-blog-list' + (currentPage === 1 ? '' : currentPage) + '.html';
                                var modData = data;
                                fs.writeFile(fileName, modData, function(err) {
                                    if (err) {
                                        done(err);
                                        return console.log(err);
                                    }
                                    console.log("The file was saved!");
                                    done(); // you never called done 
                                });
                            } else {
                                res.send([]);
                                done(); // you never called done 
                            }
                        });
                    } else {
                        res.send([]);
                        done(); // you never called done 
                    }
                }
            ], function done(err) {
                // this is called when waterfall is done or in case of error
                // it would always throw if you didn't check for error
                // also is it necessary to throw?
                // if (err) throw err;
                helper.logs('getBlogs', 'blog', err, 'console');
            });

        })(i);
    }
};