Node.js ES6 Класс не может вызвать метод класса из метода класса при использовании Express.js - PullRequest
0 голосов
/ 18 мая 2018

Nb. Это сводит меня с ума, и я несколько раз ходил по домам. Однако я довольно новичок в ES6 и JS в целом и полностью понимаю, что класс JS не похож на классы, найденные в других языках, и, возможно, подходит к этому совершенно неправильно.

Я запускаю следующий код, который использует Express.js (v4.16.3) и body-parser (v1.18.2) на Node v8.9.0.

app.post('/api/v1/user/update', urlencodedParser, user.update);

Код вызывает 'urlencodedParser', который действует как промежуточное программное обеспечение, чтобы обеспечить 'req' 'req.body', чтобы я мог вытащить поля формы. 'user' - это модуль класса, который был экспортирован и содержит все функции для проверки, обновления и т. д. и выглядит примерно так:

class Users {    
    update(req,res) {
        console.log('updating...');
        this.verifyUserIdentity();
    }

    verifyUserIdentity(req,res) {
        console.log('verify');
    }
}

module.exports = new Users;

Теперь, если бы мне нужно было запустить этот код в узле без Express, вот так:

var users = require('./modules/users');

users.update();

Все это похоже на выполнение, и я получаю следующий вывод в CLI:

updating...
verify

Если я заверну все это в app.post () (выше) и использую Postman для отправки POST, он выполнит первый метод и остановится после console.log () без ошибок. Кажется, не вызывать verifyUserIdentity () , и я получаю следующее о CLI:

updating...

Если я изменю код, как вы видите ниже, и передам массив методов в обработчик промежуточного программного обеспечения Express, он, похоже, будет работать, но теперь я должен вызывать verifyUserIdentity () отдельно, и не решить проблему вызова другого метода из того же класса, например, метода log () .

class Users {    
    update(req,res) {
        console.log('updating...');
    }

    verifyUserIdentity(req,res,next) {
        console.log('verify');
        next();
    }
}

module.exports = Users;



app.post('/api/v1/user/update', [urlencodedParser, users.verifyUserIdentity], users.update);

Некоторые мои вопросы: - Почему оригинальный шаблон не работает с Express? - это "взяло" из-за обработчиков обратного вызова? - Это как-то связано с Node v8.9.0? - Я все делаю неправильно?

1 Ответ

0 голосов
/ 18 мая 2018

Вы не получаете правильный указатель this в вашем методе.

Измените эту строку кода:

app.post('/api/v1/user/update', urlencodedParser, user.update);

на это:

app.post('/api/v1/user/update', urlencodedParser, user.update.bind(user));

Когда вы передаете user.update, все, что он передает, - это ссылка на метод update(), и ассоциация с объектом user теряется.Когда Express затем вызывает его как обычную функцию, this будет undefined (в строгом режиме) внутри этого метода, а не вашего user объекта.Вы можете использовать .bind() для решения этой проблемы, как показано выше.

К вашему сведению, это не имеет ничего общего с Express.Это общая проблема, когда в качестве обратного вызова передается ссылка на obj.method, которую требуется сохранить, а затем вызвать позже.Вы должны «привязать» объект к нему, чтобы он вызывался с правильным контекстом объекта.

...