【问题标题】:How to perform file write with increment data in node js?如何在节点 js 中使用增量数据执行文件写入?
【发布时间】:2017-11-21 04:52:28
【问题描述】:

我有一个包含 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);
        }
    })

};

【问题讨论】:

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


    【解决方案1】:

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

    您遇到问题的几点:

    • var currentPage = Number(i); 当 i 为“未定义”时 currentPage === NaN
    • var startItem = (currentPage - 1) * itemsPerPage; 相同 当 currentPage 为 'NaN' startItem === 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);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 2021-04-23
      • 2015-12-18
      • 2014-04-19
      • 2021-02-21
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多