Mongoose: Model.create returned promise does not have catch method

Created on 27 Oct 2015  路  4Comments  路  Source: Automattic/mongoose

Hi,

The "catch" function is undefined on the promise returned by Model.create function.

// Create user
  User.create(userData).then(function(user) {
    // Log the user (promisify the passport function)
    return new Promise(function(resolve, reject) {
      req.logIn(user, function(err) {
        if (err) {
          reject(err);
        } else {
          resolve(user);
        }
      });
  }).then(user => res.send(user))
  .catch(function(err) { // Here : "User.create().then().then().catch is undefined"
    var reason = err.message;
    if (reason.indexOf('E11000') > -1) {
      if (reason.indexOf('username') > -1) {
        reason = 'USERNAME_ALREADY_EXISTS';
      } else if (reason.indexOf('email') > -1) {
        reason = 'EMAIL_ALREADY_EXISTS';
      }
    }
    return next(new Error(reason));
  });

Most helpful comment

Hi @BenjaminBini, by default no mongoose promises have a .catch() (backwards compatibility reasons). Re #3441 we're working on documenting this properly. However, in mongoose >= 4.1.0 you can substitute your favorite ES6-compatible promises library. For instance, require('mongoose').Promise = global.Promise; for native promises, require('mongoose').Promise = require('bluebird'); for bluebird, or require('mongoose').Promise = require('q').Promise; for Q. Any of these should have .catch().

All 4 comments

Hi @BenjaminBini, by default no mongoose promises have a .catch() (backwards compatibility reasons). Re #3441 we're working on documenting this properly. However, in mongoose >= 4.1.0 you can substitute your favorite ES6-compatible promises library. For instance, require('mongoose').Promise = global.Promise; for native promises, require('mongoose').Promise = require('bluebird'); for bluebird, or require('mongoose').Promise = require('q').Promise; for Q. Any of these should have .catch().

This is awesome, thank you for your answer!

@vkarpov15 , how would this be implemented with ES6's import ? (i'm using native promises)

@Fire-Brand

import Promise from 'bluebird';
import mongoose from 'mongoose';

mongoose.Promise = Promise;
Was this page helpful?
0 / 5 - 0 ratings