Как изменить значение User isActive:boolean в узле Js

#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");
        });
    });
});