Вычисленное имя свойства ES5 в Node.js - когда я вызываю функцию динамически, моя консоль возвращает мне TypeError: Невозможно прочитать свойство undefined - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь поместить динамический вызов функции в Node.js, чтобы избежать бесконечного списка вариантов переключения.

Вот экземпляр файла, к которому я хочу обратиться:

var Object = require('../models/Object'); // it's a classic mongoose Schema's object

Вот моя динамическая функция:

/***** post words *****/
router.post('/words', function (req, res) {
    var word = req.body ;
    var Theme = req.body.theme


    [Theme].add[Theme](word, function(err, words) {
        if(err) {
            res.json(err);
            throw err;
        }

        return res.json(words);
    })

})

Мы предполагаем случай, когда object.name имеет значение "Object".

Функция, которую я хочу построить, должна вызывать метод addPost в другом файле. Чтобы динамически вызывать эти файлы, я подготовил механизм вычисления свойства имени. Поэтому я всегда вызываю файл, соответствующий моей потребности. Если мне потребовался объект и пользовательская публикация со значением категории объекта, хорошо, он перейдет в файл объекта, чтобы вычислить публикацию в направлении хорошего пункта назначения. Поэтому мое вычисленное свойство name выглядит следующим образом:

console.log(req.body.name) // > "Object" 
Name = req.body.name 
console.log(Name)  // > "Object" 

Хорошо, теперь

Когда я явно ввожу имя объекта для вызова функции, как показано ниже:

Object.functionObject()

функция работает нормально.

НО, если я использую вызов с динамическим значением, например:

[Name].functionOf[Name]()

функция возвращает меня:

TypeError: Невозможно прочитать свойство undefined

Также

Я пробовал с ${Name}, но моя консоль возвращает меня:

TypeError: console.log (...) не является функцией

Я пытался установить ES6 на тот же результат на стороне Node.js.

Как это возможно, так как console.log возвращает мне большое значение?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Я предполагаю, Object содержит все эти методы

router.post('/words', function (req, res){
      var word = req.body ;
      var Theme = req.body.theme; // Post

      // Object.addPost();
      Object[`add${Theme}`](word, function(err, words) {
        if(err){
          res.json(err) ;
          throw err;
        }

      return  res.json(words);
      });
      
      // if you want Object.Post.addPost then
      Object[Theme][`add${Theme}`](word, function(err, words) {
        if(err){
          res.json(err) ;
          throw err;
        }

      return  res.json(words);
      });

    });
0 голосов
/ 29 июня 2018
[Theme].add[Theme]()

Этот код создает массив с темой в качестве первого значения, а затем вызывает функцию functionOf, которой нет в типе массива. addTheme на самом деле является синтаксической ошибкой, но движок ее никогда не достигает.

Хотя я рекомендую использовать переключатель, я думаю, что вы пытаетесь сделать что-то вроде этого

// define Object1, Object2 with functionObject()
var objectCollection = {};
objectCollection[Object1.name] = Object1;
objectCollection[Object2.name] = Object2;


// Then you get req.body.name later
var objectName = req.body.name;
// and call the method
objectCollection[objectName].functionObject()

Технически это сработает, но существует множество возможностей сбоев, и если я полагаюсь на рефлексию, я нервничаю, потому что ваш клиент должен знать внутреннюю работу (например, имена объектов и функций). Это плохо.

Если поведение этих объектов настолько разное, вы, вероятно, должны разделить их на отдельные маршруты и позволить своему клиенту решить, что ему нужно, если вы создаете API.

Вы также можете создать фабрику для возврата подходящего объекта и похоронить там оператор switch.

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