簡體   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