Застрял между вложенным объектом JSON и обратным вызовом в Nodejs

#javascript #json #node.js #callback

#javascript #json #node.js #обратный вызов

Вопрос:

Мое приложение вызывает модуль для анализа вложенного объекта JSON для чтения значений 2 ключей.

 parseData(str, function (error, str) {
    if (err) {
        console.log("Error - parseData : ", err);
    } else {
        console.log(str);
    }
  

И модуль ParseData выглядит следующим образом

 function parseData(str, callback) {

  function recursiveFunction(obj) {
    var keysArray = Object.keys(obj);

    for (var i = 0; i < keysArray.length; i  ) {
      var key = keysArray[i];
      var value = obj[key];

      if (value === Object(value)) {
        parseData(value);
      } else {
        if (key == 'title') {
          title = value;
        }

        if (key == 'extract') {
          var extract = value.replace(/(rn|n|r)/gm," ");
          callback(null, JSON.stringify('{"title":'  title   ', "text":'   extract));
        }
      }
    }
  }

  recursiveFunction(str);

}
  

Но он показывает следующую ошибку

 /modules/parseData.js:22
               callback(null, JSON.stringify('{"title":'  title   ',    "text":'   extract));
               ^

TypeError: callback is not a function
  

Почему происходит сбой обратного вызова? Как вернуть обратно объект JSON?

Редактировать

В коде были некоторые ошибки, которые теперь исправлены.

    function parseData(str, callback) {
       function recursiveFunction(obj) {
           var keysArray = Object.keys(obj);

           for (var i = 0; i < keysArray.length; i  ) {
               var key = keysArray[i];
               var value = obj[key];

               if (value === Object(value)) {
                   recursiveFunction(value);
               } else {
                   if (key == 'title') {
                       title = value;
                   }

                   if (key == 'extract') {
                       var extract = value.replace(/(rn|n|r)/gm," "); 
                       callback(null, JSON.stringify('{"title":'  title   ', "text":'   extract));
                   }
               }
           }
       }
       recursiveFunction(str);
    };
  

Комментарии:

1. В вашем первом блоке кода отсутствуют a } и a ) ; это ошибка или в вашей программе есть синтаксическая ошибка?

2. добавить callback в качестве параметра при рекурсивном вызове функции

3. callback(null, JSON.stringify('{"title":' title ', "text":' extract)); выглядит очень неправильно. Если вы хотите создать правильный JSON, вы должны передать объект JSON.stringify : callback(null, JSON.stringify({title: title, text: extract})); . Но вы уверены, что хотите использовать JSON вместо объекта?

4. @Jacob, я, должно быть, допустил какую-то ошибку при копировании кода

5. @FelixKling, мы можем вернуть объект обратно, но API отвечает JSON на вызывающий запрос. Нормально ли передавать JSON?

Ответ №1:

Вы вызываете parseData(value); , а не передаете обратный вызов; передайте callback , если вы хотите, чтобы использовался этот исходный обратный вызов.

Комментарии:

1. Я не понял. Я передаю функцию обратного вызова в ParseData(str, функция (ошибка, str)).

2. Вы вызываете parseData рекурсивно внутри parseData , и этот внутренний вызов не передает обратный вызов.

3. извините, в моем коде была ошибка, я опубликовал пересмотренный код в разделе основного вопроса. Здесь я рекурсивно вызываю recursiveFunction внутри ParseData. Итак, мне нужно изменить мой вызов для recursiveFunction, чтобы исходный обратный вызов передавался при вызове модуля ParseData. recursiveFunction(str, обратный вызов); Я прав?

4. То, как это написано сейчас, вы не должны получать ту же ошибку. Если у вас сейчас другие проблемы, возможно, вам следует задать другой вопрос.