簡體   English   中英

Mongoose userSchema.pre("save") 不工作

[英]Mongoose userSchema.pre("save") Not Working

我編寫了一個方法來更新我的應用程序中的用戶,並且一切正常。 此外,我編寫了一些代碼,這些代碼會在文檔保存之前觸發並且無法正常運行。

代碼的重點是確定用戶是否修改了他們的密碼。 如果沒有,只需調用 next()。 如果他們這樣做了,bcrypt 將對密碼進行哈希處理。

這是我正在進行更新的控制器中的代碼:

// @desc    Update user by ID
// @route   PUT /api/users/:id
// @access  Private
const updateUserById = asyncHandler(async (req, res) => {
    // Destructure body content from request
    const {
        firstName,
        lastName,
        username,
        email,
        role,
        manager,
        learningStyle,
        departments,
        facility,
        company,
        isActive,
    } = req.body;
    // Search the database for the user
    const user = await User.findById(req.params.id);
    // Check to ensure the user was found. Else, respond with 404 error
    if (user) {
        // Update information accordingly
        user.firstName = firstName || user.firstName;
        user.lastName = lastName || user.lastName;
        user.username = username || user.username;
        user.email = email || user.email;
        user.role = role || user.role;
        user.manager = manager || user.manager;
        user.learningStyle = learningStyle || user.learningStyle;
        user.departments = departments || user.departments;
        user.facility = facility || user.facility;
        user.company = company || user.company;
        user.isActive = isActive === undefined ? user.isActive : isActive;
        // Save user to the database with updated information
        const updatedUser = await user.save();
        // Send the updated user to the client
        res.json(updatedUser);
    } else {
        res.status(404);
        throw new Error("User not found");
    }
});

這是我的用戶模型代碼:

import mongoose from "mongoose";
import bcrypt from "bcryptjs";

const userSchema = mongoose.Schema(
    {
        firstName: {
            // The user's first name
            required: true,
            type: String,
            trim: true,
        },
        lastName: {
            // The user's last name
            required: true,
            type: String,
            trim: true,
        },
        username: {
            // The user's username - user can create their own
            required: true,
            type: String,
            unique: true,
            lowercase: true,
        },
        email: {
            // The user's email
            required: false,
            trim: true,
            lowercase: true,
            unique: true,
            type: String,
        },
        password: {
            // The user's encrypted password (bcrypt hash)
            required: true,
            type: String,
        },
        role: {
            // The user's role - drives what they're able to do within the application
            required: true,
            type: mongoose.Schema.Types.ObjectId,
            ref: "Role",
        },
        manager: {
            // The user's manager
            type: mongoose.Schema.Types.ObjectId,
            required: false,
            ref: "User",
        },
        learningStyle: {
            // The user's learning style (after assessment is taken)
            type: mongoose.Schema.Types.ObjectId,
            required: false,
            ref: "LearningStyle",
        },
        departments: [
            // The departments the user belongs to (used to drive what the user sees)
            // Example: Finishing, Shipping, Printing
            {
                type: mongoose.Schema.Types.ObjectId,
                required: false,
                ref: "Department",
            },
        ],
        facility: {
            // The facility the user works at. Example: Austin Facility
            type: mongoose.Schema.Types.ObjectId,
            required: false,
            ref: "Facility",
        },
        company: {
            // The company the user works for. Example: Microsoft
            type: mongoose.Schema.Types.ObjectId,
            required: true,
            ref: "Company",
        },
        isActive: {
            required: true,
            type: Boolean,
            default: true,
        },
    },
    { timestamps: true }
);

// Match user's password using bcrypt
userSchema.methods.matchPassword = async function (enteredPassword) {
    return await bcrypt.compare(enteredPassword, this.password);
};

// Generate user's encrypted password on save
userSchema.pre("save", async function (next) {
    // Check to see if password is modified. If it is, encrypt it. If not, execute next();
    if (!this.isModified("password")) {
        console.log("Does this run?");
        next();
    }
    console.log("Does this run as well?");
    const salt = await bcrypt.genSalt(10);
    this.password = await bcrypt.hash(this.password, salt);
});

const User = mongoose.model("User", userSchema);

export default User;

我有:

  • 添加了兩個控制台日志,它們都在模型中觸發(請參閱 userSchema.pre("save"))。
  • 試圖通過檢查密碼是否被修改來防止加密觸發
  • 嘗試刪除整個用戶集合並重新開始
  • 課程中的另一個應用程序使用完全相同的方法工作正常

請注意,在我的控制器中,我根本沒有更新密碼。 然而,每次我使用 Postman 發送 PUT 請求並修改名稱時,密碼都會再次散列並且兩個控制台日志都會觸發。

“保存”中間件正在調用next()但繼續完成該功能。 使用returnelse來保護代碼的其余部分。

userSchema.pre("save", async function (next) {
    // Check to see if password is modified. If it is, encrypt it. If not, execute next();
    if (!this.isModified("password")) {
        // Finish here
        return next();
    }
    const salt = await bcrypt.genSalt(10);
    this.password = await bcrypt.hash(this.password, salt);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM