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

Javascript 如何在node js中使用增量数据执行文件写入?,javascript,node.js,mongoose,mean-stack,fs,Javascript,Node.js,Mongoose,Mean Stack,Fs,我有一个80个项目的列表,每页有10个项目。现在我的想法是将所有数据写入文件,这样前10个将在一个文件中,然后下10个在另一个文件中,依此类推,我的80个博客每页有10个,共有8个页面。问题是,我只得到一个文件,10个博客。其他人呢找到错误。谢谢。为此我写了如下脚本 我发现循环没有增加 exports.getBlogsTest = function(req, res) { helper.logs('getBlogs', 'blog'); var pages = ['undefin

我有一个80个项目的列表,每页有10个项目。现在我的想法是将所有数据写入文件,这样前10个将在一个文件中,然后下10个在另一个文件中,依此类推,我的80个博客每页有10个,共有8个页面。问题是,我只得到一个文件,10个博客。其他人呢找到错误。谢谢。为此我写了如下脚本

我发现循环没有增加

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);
        }
    })

};

为什么要使用这么多的
try catch
? 虽然它在许多情况下可能很有用,但您应该避免在不必要时使用它

您遇到问题的几点:

  • var currentPage=编号(i)
    当i为“未定义”时,currentPage==NaN
  • var startItem=(当前页-1)*itemsPerPage相同
    当currentPage为“NaN”时,起始值TM==NaN
我猜您认为forEach中的参数是(index,value),但反过来是(value,index)

我试图改进你的代码,但实际上还没有运行

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);
    }
};
exports.getBlogsTest=函数(req,res){ logs('getBlogs','blog'); var itemsPerPage=10; 对于(变量i=1;i<11;i++){//第1-10页 (函数(currentPage){//currentPage=i var startItem=(当前页-1)*itemsPerPage; 异步瀑布([ 功能(完成){ 如果(当前页面===1){ blogs.count().exec(函数(err,count){ 如果(错误){ logs('getBlogs','blog',err',console'); //犯错误; done(err);//将使用错误调用done回调 }否则{ 完成(null,count);//没有错误,因此发送null } }); }否则{ 完成(null,'page');//没有错误,因此发送null } }, 功能(计数,完成){ 如果(计数){ 如果(计数!=“第页”){ res.setHeader('totalItems',计数); } blogs.find().sort({date:-1})。select('-text')。skip(startItem)。limit(itemsPerPage)。exec(函数(err,data){ 如果(错误){ logs('getBlogs','blog',err',console'); 完成(错误);//你从来没有叫过完成 //犯错误; } 如果(数据和数据长度>0){ res.send(数据); var fileName='public/amp/test2/amp blog list'+(currentPage==1?'':currentPage)+'.html'; var modData=数据; writeFile(文件名、modData、函数(err){ 如果(错误){ 完成(错误); 返回console.log(err); } log(“文件已保存!”); done();//您从未调用过done }); }否则{ res.send([]); done();//您从未调用过done } }); }否则{ res.send([]); done();//您从未调用过done } } ],功能完成(错误){ //当瀑布完成或出现错误时调用此函数 //如果不检查错误,它将始终抛出 //还有必要扔吗? //如果(错误)抛出错误; logs('getBlogs','blog',err',console'); }); })(i) ); } };