#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 .