Проверить пользователя, уже доступного в БД, используя sails.js

#mysql #sails.js

#mysql #sails.js

Вопрос:

Я регистрирую нового пользователя, проверяя, что он уже доступен. Но для каждого пользователя он показывает «пользователь уже доступен»

 signup: function (req, res) {
        var username = req.param("username");
        var password = req.param("password");
        var status = false;
        console.log("user : "   username   " : "   password);
        Signup.find({username: username}).exec(function(err, usr){
            if (err) {
                var response = {status:status, error:"db error"};
                res.send(500, response);
            } else { 
              if (usr) {
                status = true;
                res.send(400, {error: "Username already Taken"});
              } 
              else {
                signup.create({username: username, password: password}).exec(function(error, user) {
                if (error) {
                    res.send(500, {error: "DB Error"});
                } else {
                    req.session.user = user;
                    res.send(user);
                }
            });
        }}
    });
  }, 
  

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

1. Вы должны попробовать вставку и перехватить ошибку, если она не удалась. Выполнение поиска, а затем вставки уязвимо для проблем с временным окном, и это также в два раза неэффективнее.

Ответ №1:

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

 signup: function(req, res) {
    var username = req.param("username");
    var password = req.param("password");
    var status = false;

    Signup.findOne({ username: username })
        .exec(function(err, usr) {
            if (err) {
                var response = { status: status, error: "db error" };
                return res.send(500, response);
            }
            if (usr) {
                //status = true; --> in this case you don't use 'status' so this assignment is unnecessary
                return res.send(400, { error: "Username already Taken" });
            } else {
                Signup.create({ username: username, password: password })
                    .exec(function(err, user) {
                        if (err) {
                            res.send(500, { error: "DB Error" });
                        } else {
                            req.session.user = user;
                            res.send(user.username);
                        }
                    });
            }
        });
}
  

Ответ №2:

 Signup.find({username: username}).exec(function(err, usr){
    // usr is an array
});
  

результатом поиска является список с объектами, соответствующими вашему запросу. В списке либо есть элементы, либо нет элементов. В обоих случаях

 if (usr) {}
  

будет true, потому что вы в основном просто проверяете, определен ли usr, который всегда есть. Поэтому измените его на

 if (usr.length === 0) {
    // already exists
}
  

Или вы меняете find на findOne .