gpt4 book ai didi

node.js - 尝试对从 Firebase 记录创建的数组运行字数统计时,无法将对象转换为原始值

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:50 24 4
gpt4 key购买 nike

我正在尝试编写一个 Node js 程序,该程序从 Firebase 数据库读取值并聚合所有单词的特定字段中的所有单词。记录,但我收到以下错误..

[2019-06-24T14:52:14.083Z]  @firebase/database: FIREBASE WARNING: Exception was thrown by user callback. TypeError: Cannot convert object to primitive value at C:\Users\xxx\Projects\NodeProjects\QuestionAppNode\index.js:52:38

TypeError: Cannot convert object to primitive value

下面是我的node.js代码..

retrieveQuestions();

function retrieveQuestions(){
userQuestionsFBRef.once("value", function(snapshot) {
var fetchedQuestions = [];

snapshot.forEach(function(snapshotChild){
var itemVal = snapshotChild.val();
fetchedQuestions.push(itemVal);

})
var arrayOfQuestions = [];
fetchedQuestions.forEach(function(question){
arrayOfQuestions += question.question
})
console.log("Fetched questions are " + JSON.stringify(fetchedQuestions));
console.log("arrayOfQuestions is " +JSON.stringify(arrayOfQuestions));
var wordcnt = arrayOfQuestions.replace(/[^\w\s]/g, "").split(/\s+/).reduce(function(map, word){
map[word] = (map[word]||0)+1;
return map;
}, Object.create(null));
console.log("Word count is " + wordcnt)
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
}

如果我在 Chrome 控制台中运行类似的代码,它确实可以工作,即

var arrayOfQuestions = [{"dateTime":"2019-06-24T14:06:36.983Z","name":"AMA09","question":"Who let the dogs out?"},{"dateTime":"2019-06-24T14:07:11.501Z","name":"AMA09","question":"What is the capital of Senegal?"},{"dateTime":"2019-06-24T14:20:25.222Z","name":"AMA34","question":"Is Free will an illusion?"}];

var newArray = [];

arrayOfQuestions.forEach(question => newArray += question.question);

var wordcnt = newArray.replace(/[^\w\s]/g, "").split(/\s+/).reduce(function(map, word){
map[word] = (map[word]||0)+1;
return map;
}, Object.create(null));

有人知道为什么会发生这种情况吗?

我意识到我所采取的聚合这些记录中的单词的方法可能不是正确的方法,即将所有文本添加到Facebook 记录的问题字段可能有点愚蠢,不适用于大型数据集,因此如果有人可以提供任何建议不同的方法也将受到赞赏。

非常感谢。

最佳答案

问题似乎出在这一行:

console.log("Word count is " + wordcnt)

由于 wordcnt 是一个没有原型(prototype)的对象,即 Object.create(null),它没有 toString 方法,因此会出现错误“TypeError:无法将对象转换为原始值”

解决方案 1 - 在归约表达式中使用对象文字语法:

var wordcnt = arrayOfQuestions
.replace(/[^\w\s]/g, "")
.split(/\s+/)
.reduce(function(map, word){
map[word] = (map[word]||0)+1;
return map;
}, {}); // Object literal instead of Object.create(null)

这将创建一个具有常见 Object 原型(prototype)的对象,该原型(prototype)具有 toString 方法。

解决方案 2 - 不要在 console.log 中连接,而是使用多个参数:

console.log("Word count is", wordcnt) // instead of " + wordcnt)

这允许console.log 进行对象的正常字符串化。

解决方案 3 - 将 wordcnt 映射转换为 json 字符串。

console.log("Word count is " + JSON.stringify(wordcnt))

这会将您的对象转换为其自身的 JSON 表示形式。

关于node.js - 尝试对从 Firebase 记录创建的数组运行字数统计时,无法将对象转换为原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com