npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

mongoose-findone-or-error

v1.0.0

Published

Simple Mongoose plugin for rejecting findOne and findById promises which resolve null.

Downloads

17

Readme

mongoose-findone-or-error

Simple Mongoose plugin for rejecting findOne and findById promises which resolve null.

Installation

Hook the plugin to a schema:

// global level
const mongoose = require('mongoose');
const findOrErrorPlugin = require('mongoose-findone-or-error');
mongoose.plugin(findOrErrorPlugin);

// schema level
// example.js

const mongoose = require('mongoose');
const findOrErrorPlugin = require('mongoose-findone-or-error');

const schema = new mongoose.Schema({
  name: String,
  description: String
});

schema.plugin(findOrErrorPlugin);

mongoose.model('Example', schema);

Usage

Execute use statics method

const Example = require('./example');

// use with statics findByIdOrError
// 1. Promise
Example.findByIdOrError('idNotInDatabase')
  .then(doc => {
    console.log('Only executed when document is found');
  })
  .catch(err => {
    console.log(err);
  });
 // 2. Callback
 Example.findByIdOrError('idNotInDatabase', function(err, doc) {
   if (err) {
     console.log('Here not found error');
     return
   }
   console.log('Only executed when document is found');
 })
  
 // or use with statics findOneOrError
 Example.findOneOrError({ name: 'plugin example' })
   .then(doc => {
     console.log('Only executed when document is found');
   })
   .catch(err => {
     console.log(err);
   });

  Example.findOneOrError({ name: 'plugin example' }, function(err, doc) {
   if (err) {
     console.log('Here not found error');
     return
   }
   console.log('Only executed when document is found');
 })

Execute use query helpers:

const Example = require('./example');
  // 1. Promise
 Example.findOne({ name: 'plugin example' })
   .select({name: 1})
   .throwEmpty() // <- add this line before .then() or .exec()
   .limit(10)
   .then(doc => {
     console.log('Only executed when document is found');
   })
   .catch(err => {
     console.log(err);
   });
  // 2. Promise
  // or set option emptyError
  Example.findOne({ 
    name: 'plugin example' 
  }, null, {
    lean: true, // other option
    emptyError: true // <- add this option
  })
   .then(() => {
     console.log('Only executed when document is found');
   })
   .catch(err => {
     console.log(err);
   });
  // 3. Callback
  Example.findOne({ 
    name: 'plugin example' 
  }, '_id name', {
    emptyError: true // <- add this option
  }, function(err, doc) {
   if (err) {
     console.log('Here not found error');
     return
   }
   console.log('Only executed when document is found');
 })

 // findById same as findOne
 ...

Default Error Handle

// modelName: return the mode name
// query: return Query.getQuery()
// emptyQueryOption: return Query.getOptions()[queryOption]

function defaultSendEmptyError (modelName, query, emptyQueryOption) {
  const error = new Error(`${_.upperFirst(_.camelCase(modelName))} not found.`)
  error.name = 'DocumentNotFoundError'
  if (!_.isBoolean(emptyQueryOption)) { error.code = emptyQueryOption }
  return error
}

Plugin Options

// default options
schema.plugin(findOrErrorPlugin, {
  static: { //  set `false` disable both findOneOrError and findByIdOrError
    findOneFname: 'findOneOrError', // custom function name or set `false` disable it
    findByIdFname: 'findByIdOrError' // custom function name or set `false` disable it
  },
  query: { //  set `false` disable query helpers
    queryFname: 'throwEmpty', // use .throwEmpty(true) or .throwEmpty(404)
    queryOption: 'emptyError' // use { emptyError: true } or  { emptyError: 404 }
  },
  sendEmptyError: sendEmptyError // must reutrn an instanceof Error
});

Error With code

// .throwEmpty(code)
Example.findOne({ name: 'plugin example' })
   .select({name: 1})
   .throwEmpty(404) // set code to error.code
   .limit(10)
   .then(doc => {
     console.log('Only executed when document is found');
   })
   .catch(err => {
     console.log(err.code) // 404
   });


// { emptyError: code }
Example.findOne({ 
    name: 'plugin example' 
  }, '_id name', {
    emptyError: 404
  }, function(err, doc) {
   if (err) {
     console.log(err.code) // 404
     return
   }
   console.log('Only executed when document is found');
 })

Running tests

npm test