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



我有一个包含 80 个项目的列表,每页上有 10 个项目。现在我的想法是将所有数据写入文件,以便前 10 个在一个文件中,然后接下来的 10 个在另一个文件中,依此类推,我的 80 个博客每页 10 个,每个页面有 10 个。问题是我只得到一个文件被写了 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 = Number(i);当我是"未定义"当前页面 === NaN
  • var startItem = (currentPage - 1) * itemsPerPage;也一样当当前页面为"NaN"时,起始项 === 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);
    }
};

相关内容

  • 没有找到相关文章

最新更新