简体   繁体   中英

How can handle the error in node.js?

models/user.js

var User = module.exports = mongoose.model('User',UserSchema);

module.exports.getUserByUsername = function(username, callback){
    var query = {username:username};
    User.findOne(query, callback);
}

module.exports.createUser = function(newUser, callback){
    User.getUserByUsername(newUser.username,function(err,username){
        if(err) throw err;
        // username already exists
        if(username){
            // How can handle this error?
            console.log('username already exists');
        } else{
            bcrypt.hash(newUser.password, 10, function(err,hash){
                if(err) throw err;
                newUser.password = hash;
                newUser.save(callback);
            });
        }
    });
}

router/users.js

router.post('/register',function(req,res,next){
    var username = req.body.username;
    var password = req.body.password;

    var newUser = new User({
        username:username,
        password:password
    });

    req.checkBody('username','Username field is required').notEmpty();
    req.checkBody('password','Password field is required').notEmpty();

    var errors = req.validationErrors();

    if(errors){
        res.render('register',{
            errors: errors,
            username: username,
            password: password
        });
    } else{
        User.createUser(newUser,function(err,user){
            if(err) throw err;
            req.flash('success','You are now registered and may log in');
            res.location('/');
            res.redirect('/');
        });
    }
});

above codes are about a user registration code.

in models/user.js

I made a function 'createUser' that get a new User, and find whether it already exists. However, I don't know how to throw custom error, "User already exists"..

What should I do?

I tried like this :

// username already exists
if(username) {
  callback(new Error('username already exists'));
}

but It didn't work!

To throw an error with a message "username already exsits", what should I do?

Thank you for reading. :)

ps) models/user.js -> createUser function was defined.

routes/users.js -> createUser function was attached to work.

You could handle this by just following Node best practices and return an error in the callback

module.exports.createUser = function(newUser, callback){
    User.getUserByUsername(newUser.username, function(err, username) {
        if(err) throw err;

        if(username){
            callback('username already exists', null); // callback(error, data) ...

        ......

Then catch it

router.post('/register',function(req,res,next){
    ... get data

    if(errors){
        res.render('register',{
            errors: errors,
            username: username,
            password: password
        });
    } else {
        User.createUser(newUser,function(err,user){
            if(err) {
                res.render('register',{
                    errors: err,         // username already exists
                    username: username,
                    password: password
                });
            } else {
                req.flash('success','You are now registered and may log in');
                res.location('/');
                res.redirect('/');
            }
        });
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM