[英]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不起作用,在循環外調用它是有效的。
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
。
我懷疑您的問題是以下一項或多項:
DB.GetSuggestions
沒有正確導入TextHandler.js
。 當它不在迭代循環中時,是否可以確認該函數在TextHandler.js
? while
循環應使用==
或===
(嘗試兩者)進行條件比較,而不是=
。 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.