Skip to content

Instantly share code, notes, and snippets.

@umidjons
Created October 18, 2016 12:57
Show Gist options
  • Save umidjons/2bef8bb80c041c0fdd4e69dd7175121a to your computer and use it in GitHub Desktop.
Save umidjons/2bef8bb80c041c0fdd4e69dd7175121a to your computer and use it in GitHub Desktop.
Catch duplicate error (E11000) key index in MongoDB

Catch duplicate error (E11000) key index in MongoDB

import * as RPC from 'json-rpc-core';
import {utils, validate} from './utils';

@RPC.module()
export default class Users {
	@RPC.params({
		email: {type: String, coerce: utils.trim, validate: validate.isEmail},
		name: {type: String, coerce: utils.trim, default: null},
		surname: {type: String, coerce: utils.trim, default: null}
	})
	static async subscribe(params) {
		let doc = {email: params.email};

		if (params.name) {
			doc.name = params.name;
		}

		if (params.surname) {
			doc.surname = params.surname;
		}

		let resp = {success: false};

		try {
			let result = await db.main.users.insertOne(doc);
			if (result._id) {
				resp.success = true;
			}
		} catch (error) {
			// We have unique index by email field
			// Here we catch duplicate error key and return success
			// If we get other errors, we will re-throw them
			if (error.name == 'MongoError' && error.code == 11000) {
				console.log('Email already exists, so ignoring it and returning success!');
				resp.success = true;
			} else {
				throw error;
			}
		}

		return resp;
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment