How to check if that data already exist in the database during update (Mongoose And Express)

后端 未结 8 1839
灰色年华
灰色年华 2020-12-05 00:28

How to do validations before saving the edited data in mongoose?

For example, if sample.name already exists in the database, the user will receive a som

相关标签:
8条回答
  • 2020-12-05 00:50

    Here is another way to accomplish this in less code.

    UPDATE 3: Asynchronous model class statics

    Similar to option 2, this allows you to create a function directly linked to the schema, but called from the same file using the model.

    model.js

     userSchema.statics.updateUser = function(user, cb) {
      UserModel.find({name : user.name}).exec(function(err, docs) {
        if (docs.length){
          cb('Name exists already', null);
        } else {
          user.save(function(err) {
            cb(err,user);
          }
        }
      });
    }
    

    Call from file

    var User = require('./path/to/model');
    
    User.updateUser(user.name, function(err, user) {
      if(err) {
        var error = new Error('Already exists!');
        error.status = 401;
        return next(error);
      }
    });
    
    0 讨论(0)
  • 2020-12-05 00:54

    In addition to already posted examples, here is another approach using express-async-wrap and asynchronous functions (ES2017).

    Router

    router.put('/:id/settings/profile', wrap(async function (request, response, next) {
        const username = request.body.username
        const email = request.body.email
        const userWithEmail = await userService.findUserByEmail(email)
        if (userWithEmail) {
            return response.status(409).send({message: 'Email is already taken.'})
        }
        const userWithUsername = await userService.findUserByUsername(username)
        if (userWithUsername) {
            return response.status(409).send({message: 'Username is already taken.'})
        }
        const user = await userService.updateProfileSettings(userId, username, email)
        return response.status(200).json({user: user})
    }))
    

    UserService

    async function updateProfileSettings (userId, username, email) {
        try {
            return User.findOneAndUpdate({'_id': userId}, {
                $set: {
                    'username': username,
                    'auth.email': email
                }
            }, {new: true})
        } catch (error) {
            throw new Error(`Unable to update user with id "${userId}".`)
        }
    }
    
    async function findUserByEmail (email) {
        try {
            return User.findOne({'auth.email': email.toLowerCase()})
        } catch (error) {
            throw new Error(`Unable to connect to the database.`)
        }
    }
    
    async function findUserByUsername (username) {
        try {
            return User.findOne({'username': username})
        } catch (error) {
            throw new Error(`Unable to connect to the database.`)
        }
    }
    
    // other methods
    
    export default {
        updateProfileSettings,
        findUserByEmail,
        findUserByUsername,
    }
    

    Resources

    async function

    await

    express-async-wrap

    0 讨论(0)
提交回复
热议问题