У меня возникла проблема при создании контроллера, в котором есть класс userController, который имеет методы login и createuser, и я пытаюсь получить доступ к методу, который я описал, из этого объекта, но я не могу получить доступ к методу this.userExists (). Когда я пытаюсь получить доступ, он показывает, что userExists не определен.
import User from '../models/User';
class userController {
userExists(username) {
User.findOne({ username }, (err, user) => {
if (!!user) {
return true;
} else {
return false;
}
});
}
login(req, res) {
const data = req.body;
const { username } = data;
console.info(this);
if (!this.userExists(username)) { //returns undefined
res.status(404).json({ success: false, error: 'User not found' });
return;
}
User.findOne(data, ('name', 'username'), (err, user) => {
console.info(user);
if (err) {
res.status(400).json({ success: false, error: 'Error in sever' });
} else {
if (user) {
res.status(200).json({ success: true, user, token: user.generateToken() });
} else {
res.status(404).json({ success: false, error: 'user not found' });
}
}
});
}
create(req, res) {
const data = req.body;
if (this.userExists) {
res.status(403).json({ success: false, error: 'User already exists' });
return;
}
console.info(data);
const user = new User(data);
user.save((err, data) => {
if (err) {
console.info(err);
res.status(400).json({ success: false, error: 'Error in server' });
} else {
res.status(200).json({ success: true, user });
}
});
}
}
export default new userController();
Собственно, возврат из внутренней функции не возвращается во внешнюю. Было бы лучше использовать обещание findOne() вместо того, чтобы предполагать, что вы используете версию мангуста, которая поддерживает обещания
Если вы добавите код для findOne, возможно, мы придумаем решение.
@ Энди, это метод мангуста
Дело в том, что я не могу получить доступ к методу userExists из метода входа в систему с помощью метода this.login. Не знаю почему: /
Вы сбиваете с толку доступ к методу тем, что метод ничего не возвращает. Также findOne() - это асинхронный
Кроме того, userExists нуждается в переданном name. Вы этого не делаете.
@andy передал имя, не сработало. На самом деле, когда я пытаюсь сделать console.info(this), он возвращает undefined.
@charlietfl Хорошо, даже если findOne является асинхронным, разве функция userExists () не должна быть доступна для this.userExists()? Дело в том, что когда я пытаюсь это сделать. UserExists () показывает, что userExists не определен
Нет, это показывает, что результат вызова this.userExists() не определен, а не то, что this.userExists не определен. Большая разница. Последний вызовет ошибку. Опять же, вы путаете доступ к методу с тем, что метод возвращает



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


userExistsничего не возвращает. Обратный вызов в функцииfindOneвозвращает что-то, но это не все.