#javascript #node.js #mongodb #express #mongoose
#javascript #node.js #mongodb #выразить #мангуст
Вопрос:
Пользовательская модель, которая имеет isActive:Boolean
При нажатии кнопки происходит перенаправление на route и поиск пользователя с id из параметров.
после нахождения пользователя проверяется значение isActive.
Если значение не равно true, измените его на false или, если значение равно true, измените его на true
<form action="/admin/user/<%= user._id %>/status?_method=PUT" method="POST">
<button type="submit" class="btn btn-success btn-group-sm"><i class="fas fa-check-circle"></i></button>
</form>
Кнопка, которая отправляет запрос как отправленный в route
const mongoose = require("mongoose");
const passportLocalMongoose = require("passport-local-mongoose");
const UserSchema = mongoose.Schema({
name: String,
mobile: String,
gender: String,
username: String,
password: String,
isActive: {
type: Boolean,
default: true
},
created: {
type: Date,
default: Date.now()
}
});
UserSchema.plugin(passportLocalMongoose);
const User = new mongoose.model("user", UserSchema);
module.exports = User;
Маршрут для поиска и изменения значения isActive
router.put("/admin/user/:id/status", (req, res) => {
User.findById(req.params.id, (err, foundUser) => {
console.log(foundUser.isActive);
if (err) {
console.log(err);
} else if (foundUser.isActive == false) {
User.update({_id: req.params.id}, {$set: {isActive: true}});
res.redirect("/admin/users-details");
} else {
User.update({_id: req.params.id}, {$set: {isActive: false}});
res.redirect("/admin/users-details");
}
});
});
Комментарии:
1. Откуда вы знаете, что это не работает?
2. @hoangdv Я проверил в базе данных, значение isActive не меняется
Ответ №1:
в вашей модели isActive
тип поля является Boolean
, но вы проверяете его как строку:
else if (foundUser.isActive !== "true")
измените его else if(foundUser.isActive)
также вы можете выполнить поиск и обновление пользователя в одном запросе mongodb, как показано ниже: User.findOne({ _id: req.params.id }, function(err, user) {
user.isActive = !user.isActive;
user.save(function(err, updatedUser) {
...
});
});
Комментарии:
1. Я пробую это, но это все еще не работает, иначе, если (!foundUser.isActive) { User.update({_id: req.params.id }, {$set: {isActive: false}}); res.redirect(«/admin/users-details»);
2. @jimit_jd извините, измените условие:
else if (foundUser.isActive)
… если пользователь активен, сделайте его неактивным и наоборот.3. @jimit_jd можете ли вы увидеть вывод
console.log(foundUser.isActive)
?4. да, я вижу вывод console.log(foundUser.isActive), но при попытке изменить его не работает
Ответ №2:
Попробуйте дождаться, пока процесс обновления не выдаст результат перед перенаправлением страницы, на примере вы можете увидеть, что происходит при попытке обновить запись:
router.put("/admin/user/:id/status", (req, res) => {
User.findById(req.params.id, (err, foundUser) => {
console.log(foundUser.isActive);
if (err) {
console.log(err);
return res.redirect("/admin/users-details?error=" err.toString());
}
User.update({ _id: foundUser._id }, { $set: { isActive: !foundUser.isActive } }, (err2, result) => {
console.log(err, result);
res.redirect("/admin/users-details");
});
});
});