NodeJS MongDB查询

时间:2017-10-09 18:48:06

标签: javascript node.js mongodb

我正在使用NodeJS和MongoDB数据库构建一个webapp。目前以下令我感到沮丧 - 我缺乏理解回调/(a)同步元素并仍在学习这一点,所以我认为它与这方面有关。

我有两个主要模块:

DB.js export - 此函数在单独调用时有效:

DB.GetSuggestions: function(searchTerm) {
    return MongoClient.connect(url).then(function(db) {
        var collection = db.collection("AccentPairs");
        collection.updateMany(
            {Unstressed: searchTerm},
            {$inc: {QueryCount: 1}}
        );
        var result = collection.aggregate([
            { $match: { Unstressed: searchTerm } },
            { $group: { _id: {"WordID": "$WordID", "WordName": "$WordName", "Unstressed": "$Unstressed", "Stressed": "$Stressed", "TranslationEn": "$TranslationEn"}, Forms: { $push: "$Field" }}}
        ]).sort( { Chosen: -1} ).toArray();
        db.close();
        return result;
    });
}

TextHandler.js:

var DB = require("../DB");

function ImportText(Text) {
  var fullText = Text.trim();
  var TextObject = {AuthorName: "", Title: "", Words: []};
  var currentWord = "";
  var BOS = true;
  var EOS = false;
  let reg = /([а-яА-ЯЁё́]+)([^а-яА-ЯЁё́]*)/g;
  var result;
  while (result = reg.exec(fullText)) {
    BOS = EOS;
    EOS = (result[2].indexOf(".") > -1);
    currentWord = result[1];
    WordObject = {WordText: result[1], WordID: "0", Options: [], Tail: result[2], BOS: BOS, EOS: EOS};
    TextObject.Words.push(WordObject);
  }
  //This is what doesn't work - GetSuggestions within the loop doesn't work.
  TextObject.Words.forEach(function(wd){

    console.log(wd.WordText);
    DB.GetSuggestions(wd.WordText).then(function(suggestions){
      wd.Options = suggestions;
    });
  });
}

我正在尝试迭代TextObject.Words数组并使用GetSuggestions函数在数据库中搜索建议。在循环内部调用GetSuggestions并不起作用。

错误讯息: enter image description here < ---最后几个GC --->

29335 ms:Mark-sweep 1386.5(1440.6) - > 1386.5(1440.6)MB,1156.9 / 0.7 ms [分配失败] [旧空间需求中的GC uested。    30456 ms:Mark-sweep 1386.5(1440.6) - > 1387.5(1424.6)MB,1120.6 / 0.7 ms [最后的手段gc]。    31576 ms:Mark-sweep 1387.5(1424.6) - > 1388.4(1424.6)MB,1119.4 / 0.7 ms [last resort gc]。

< --- JS stacktrace --->

==== JS堆栈跟踪======================================== =

安全上下文:000001186EBCFB49     1:/ *匿名 /(又名/ 匿名* /)[C:\ Home \ CS \ TextAnalysis \ Ezhik \ node_modules \ mongodb \ lib \ url_parser.js:~7] [p c = 000003CC6CBB279E](这= 000001186EB04381​​,网址= 0000004FD766F421)     2:参数适配器框架:2-> 1     3:connect(又名连接)[C:\ Home \ CS \ TextAnalysis \ Ezhik \ node_modules \ mongodb \ lib \ mongo_client.js:~390] [pc = 000 ...

致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足

3 个答案:

答案 0 :(得分:1)

您不能使用Promisified GetSuggestion调用以这种方式使用forEach。请使用Promises迭代TextObject。请参阅以下链接(#mistake number 2)以了解如何在此类情况下使用Promise。

答案 1 :(得分:1)

由于您收到“JavaScript堆内存不足”错误,并且由于相关函数在循环外调用时有效,因此您会以某种方式陷入无限循环。使用while中的TextHandler.js循环相对容易。

我怀疑您的问题是以下一项或多项:

  1. DB.GetSuggestions未正确导入TextHandler.js。如果函数不在迭代循环中,你可以确认该函数在TextHandler.js 内是否有效吗?
  2. while循环应使用=====(同时尝试两者)进行比较,而不是=
  3. ImportText中,您创建了一个新的未定义变量result,并在下一行中将其用于while循环的比较条件。你可能不打算在这里定义result,它可能会导致你的无限循环(假设reg.exec(fullText))正常工作)。
  4. 如果这些步骤有帮助,请告诉我。

答案 2 :(得分:1)

 TextObject.Words.forEach(function(wd){ // iteration

    console.log(wd.WordText);
    DB.GetSuggestions(wd.WordText).then(function(suggestions){ // async block
      wd.Options = suggestions;
    });
  });

您正在迭代异步块DB.GetSuggestions(wd.WordText),它不等待异步块完成并继续迭代到下一个项目。你需要Promise轻松处理异步函数。你可以Promise.all

我发现“Iterate over async function”的回答是您的问题最相关的