2017-10-09 128 views
0

我建設有和的NodeJS MongoDB數據庫web應用程序。目前,以下令我感到沮喪 - 我缺乏對回調/(a)同步元素的理解,仍然在學習這一點,所以我認爲它與這方面有關。的NodeJS MongDB查詢

我有兩個主要模塊:

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不起作用。

錯誤消息: enter image description here < ---過去數個地方選區--->

29335毫秒:馬克 - 掃1386.5(1440.6) - > 1386.5(1440.6)MB,1156.9/0.7毫秒[分配失敗] [在舊空間中的GC請求] [請求] 。 30456毫秒:馬克掃1386.5(1440.6) - > 1387.5(1424.6)MB,1120.6/0.7毫秒[不得已GC。 31576毫秒:馬克掃1387.5(1424.6) - > 1388.4(1424.6)MB,1119.4/0.7毫秒[不得已GC。

< --- JS堆棧跟蹤--->

==== JS堆棧跟蹤========================= ================

安全方面:000001186EBCFB49 1:/ *匿名/(又名/匿名* /)[C:\首頁\ CS \ TextAnalysis \ Ezhik \ node_modules \ mongodb \ lib \ url_parser.js:〜7] [p c = 000003CC6CBB279E](this = 000001186EB04381​​,url = 0000004FD766F421) 2:arguments adapter frame:2> 1 3:connect(aka connect) [C:\首頁\ CS \ TextAnalysis \ Ezhik \ node_modules \ MongoDB的\ LIB \星期一go_client.js:〜390] [PC = 000 ...

致命錯誤:CALL_AND_RETRY_LAST分配失敗 - 的JavaScript堆出來的內存

+1

什麼錯誤,你接受? – 223seneca

+1

你期待**發生了什麼? **實際**發生了什麼? – zero298

+0

沒有錯誤 - 它只是卡在循環中。編輯:更新後。 – pwwolff

回答

1

以這種方式與Promisified GetSuggestion電話不能使用的forEach。請使用Promises來迭代TextObject。請參閱下面的鏈接(#錯誤號碼2),以瞭解如何使用Promises來處理這種情況。

+0

哎呀,這裏是鏈接 - https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – Dinesh

+0

偉大 - 我認爲這可能是這種性質的東西。我在做什麼感覺不對。看起來我需要研究許諾。 – pwwolff

+1

請讓我們知道這是否解決了您的問題,因爲我對可能出現問題的另一種預感。 – 223seneca

1

既然你收到「JavaScript的堆內存不足」的錯誤,並且由於相關功能工作時稱爲循環之外,你陷入無限循環莫名其妙。這與while循環相比較容易,您可以在TextHandler.js中使用該循環。

我懷疑你的問題是一個或多個以下的:

  1. DB.GetSuggestions不導入到正確TextHandler.js。你能否證實函數工作TextHandler.js時,它不是一個迭代循環內?
  2. while循環應在其條件,不是=比較=====(嘗試這兩種)的使用。
  3. ImportText中,您將創建一個新的未定義變量result,並在下一行將其用於while循環的比較條件中。您可能不希望result在此處未定義,並且可能導致您的無限循環(假設reg.exec(fullText))在其他方面正常工作)。

讓我知道這些步驟是否有幫助。

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.all

我發現從「Iterate over async function」回答您的問題最相關