Не удается преобразовать объект в примитивное значение при попытке запустить подсчет слов в массиве, созданном из записей Firebase - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь написать программу 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));

Кто-нибудь знает, почему это происходит??

Я понимаю, что подход, который я использую для агрегирования слов в этих записях, вероятно, не правильный путь, то есть добавление всего текста в поле вопроса записей fb, вероятно, немного глупо и бесполезно.не работает для больших наборов данных, так что если кто-то может предложить какие-либо предложения по другому подходу, который также будет оценен.

Большое спасибо.

1 Ответ

1 голос
/ 24 июня 2019

Проблема, по-видимому, заключается в следующей строке:

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

Поскольку wordcnt является объектом без прототипа, то есть Object.create(null), у него нет метода toString, следовательно, ошибка «Ошибка типа: невозможно преобразовать объект в примитивное значение» .

Решение 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)

Thisсоздает объект с обычным Object прототипом, который имеет метод 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-представление самого себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...