javascript中的单词频率计数?

时间:2018-04-12 00:27:37

标签: javascript node.js express

我正在学习javascript,现在我正试图从我的express node.js后端的字符串数组中获取单词频率计数。我的代码如下:

  upload(req, res, function(err) {
    if (err) {
        console.log(err);
        return res.end('Error');
    } else {
        console.log(req.body);
        req.files.forEach(function(item) {
            const data = fs.readFileSync(item.path);
            pdfText(data,  function(err, chunks) {
                chunks.forEach(function(item, index){
                  newitem = item.split(" ");
                  newitem.forEach(function(item, index){

                  });
                });
            });

        });
        // no output at this point
        console.log(dictCount);

        res.end('File uploaded');
    }
});

当我执行console.log(dictCount)时,没有输出。我尝试通过在if(item.match)子句中执行console.log来调试代码,但这会使Express应用程序崩溃。为什么会发生这种情况我感到很沮丧?有人可以提供一些提示吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

我想到了我认为我看到的问题:

upload(req, res, function(err) {
    if (err) {
        console.log(err);
        return res.end('Error');
    } else {
        console.log(req.body);
        req.files.forEach(function(item) {
            const data = fs.readFileSync(item.path);
            pdfText(data,  function(err, chunks) { // asynchronous
                chunks.forEach(function(item, index){ // runs later
                  newitem = item.split(" ");
                  newitem.forEach(function(item, index){
                    if(item.match(/^[a-z0-9]+$/i)){
                      if(item in dictCount){
                        dictCount[item].count++;
                        // console log here crash the app
                        //console.log(item);
                        //console.log(dictCount[item]);
                      }else{
                        dictCount[item]={word: item, count:0};
                      }
                    }
                  });
                });
            });

        });
        // no output at this point
        console.log(dictCount); // runs immediately, before the "runs later" part

        res.end('File uploaded');
    }
});

这可能会改为:

此外,这里有一个使用npm bluebird模块和节点8+ async / await来减少代码的示例:

upload(req, res, async err => {
  try {
    if (err) {
      console.log(err);
      return res.end('Error');
    } else {
      console.log(req.body);
      await bluebird.each(req.files, async item => {
        const data = fs.readFileSync(item.path);
        const chunks = await bluebird.fromCallback(cb => pdfText(data, cb));
        chunks.forEach((item, index) => {
          newitem = item.split(" ");
          newitem.forEach((item, index) => {
            if (item.match(/^[a-z0-9]+$/i)) {
              if (item in dictCount) {
                dictCount[item].count++;
                // console log here crash the app
                //console.log(item);
                //console.log(dictCount[item]);
              } else {
                dictCount[item] = { word: item, count: 0 };
              }
            }
          });
        });
      });
      console.log(dictCount);
      res.end('File uploaded');
    }
  } catch (e) {
    res.end('Error')
  }
});

编辑:删除了无效的示例。