Имя метода не является функцией

У меня проблема с вызовом метода в моем модуле.

There is an errorTypeError: usr.User.getAddress is not a function

Я не знаю, как это исправить. Думаю, у меня проблема с кодом модуля. Я хочу получить адрес или результат.

в моем main.js

var mysql = require('mysql');
var usr = require('./user');

  var useraddress = usr.User.getAddress (id,pool); //this is how I access the method

в моем user.js

exports.User = function () {

    return {
        getAddress: function (userid, pool){
            pool.getConnection(function (err, connection) {
                var options = {
                    sql: " select address from user where id = ?
                };

                var querypos = connection.query(options, [userid], function (err, results) {
                    if (err) throw err;


                });

            });
        }
   };

};

2 ответа

Решение

Вы экспортируете User как фабричная функция, которая возвращает объект с getAddress метод на это. Так что вам нужно вызвать (создать экземпляр) User первый:

var useraddress = usr.User().getAddress(id, pool);

Еще одна важная проблема. connection.query запрос асинхронный, что означает, что присвоение результата getAddress var useraddress не имеет смысла. Вместо этого вам нужно либо передать обратный вызов getAddress или используйте шаблон Promise (проверьте этот пост для получения более подробной информации по теме: Как вернуть ответ от асинхронного вызова?).

В вашем случае, я думаю, что-то вроде этого было бы самым простым рабочим подходом:

exports.User = function () {
    return {
        getAddress: function (userid, pool){
            pool.getConnection(function (err, connection) {
                var options = {
                    sql: "select address from user where id = ?"
                };

                var querypos = connection.query(options, [userid], function (err, results, callback, errCallback) {
                    if (err) {
                      errCallback(err);
                    }
                    callback(results);
                });
            });
        }
   };
};

и использование:

usr.User().getAddress(id, pool, function(result) {
    console.log('Loaded', result);
});

Это потому что usr.User не имеет .getAddress собственность на это. Использовать .getAddress как свойство, вам нужно вместо этого экспортировать User как объект.

exports.User = {
    getAddress: function (userid, pool){
        pool.getConnection(function (err, connection) {
            var options = {
                sql: " select address from user where id = ?
            };

            var querypos = connection.query(options, [userid], function (err, results) {
                if (err) throw err;


            });

        });
      }
    };
 };

Теперь это так.

Другие вопросы по тегам