繁体   English   中英

NodeJS MongDB查询

[英]NodeJS MongDB query

我正在使用NodeJS和MongoDB数据库构建一个Webapp。 当前,以下内容使我感到沮丧-我缺乏对callback /(a)sync元素的了解,但仍在学习该知识,因此我认为它与这方面有关。

我有两个主要模块:

DB.js导出-单独调用时此函数起作用:

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不起作用,在循环外调用它是有效的。

错误信息: 在此处输入图片说明 <---后几个GC --->

29335 ms:标志扫描1386.5(1440.6)-> 1386.5(1440.6)MB,1156.9 / 0.7 ms [分配失败] [需要旧空间中的GC]。 30456毫秒:标记扫描1386.5(1440.6)-> 1387.5(1424.6)MB,1120.6 / 0.7毫秒(最后使用gc)。 31576毫秒:Mark-sweep 1387.5(1424.6)-> 1388.4(1424.6)MB,1119.4 / 0.7毫秒(最后使用gc)。

<--- JS堆栈跟踪--->

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

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

严重错误:CALL_AND_RETRY_LAST分配失败-JavaScript堆内存不足

您不能通过Promisified GetSuggestion调用以这种方式使用forEach。 请使用Promises遍历TextObject。 请参阅下面的链接(错误编号2)以了解如何在此类情况下使用Promises。

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

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

  1. DB.GetSuggestions没有正确导入TextHandler.js 当它不在迭代循环中时,是否可以确认该函数TextHandler.js
  2. while循环应使用===== (尝试两者)进行条件比较,而不是=
  3. ImportText您将创建一个新的未定义变量result并在下一行中将其用于while循环的比较条件中。 你可能不打算对result在这里没有定义,这可能会造成您无限循环(假设reg.exec(fullText))运行正常)。

让我知道这些步骤是否有帮助。

 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) ,该块不等待异步块完成,而是移至迭代中的下一项。 您需要Promises轻松处理异步功能。 您可以执行Promise.all

我从“ 遍历异步函数 ”中找到了答案,这与您的问题最相关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM