[英]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.