2017-06-19 45 views
0

我有一个80个项目的列表,我在每个页面上得到10个项目。现在我的想法是将所有的数据写入文件,这样前10个将在一个文件中,然后在另一个文件中接着10个,等等我为每个页面中的10个博客创建了8个页面。问题是我得到的只有一个文件被写入了10个博客,其他人有什么关系。任何人都可以找到该错误。谢谢。为此,我编写了如下脚本,如何用节点js中的增量数据执行文件写入?

我发现循环没有增加。

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('[email protected]@@@@@@@@@@@@@@@@@@') 
             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); 
     } 
    }) 

}; 

回答

0

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

  • var currentPage = Number(i); 当 '未定义' 我当前是=== NaN的
  • 同为var startItem = (currentPage - 1) * itemsPerPage; 当当前页是“南的起始物品===楠:

    ,你有一个问题的几个要点

我猜是什么,你以为在的forEach的PARAMS是(指数值),但它反过来(价值指数)

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

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