querymen-v2

2.1.5 • Public • Published

Querymen

JS Standard Style NPM version Build Status Coveralls Status Dependency Status Downloads

Querystring parser middleware for MongoDB, Express and Nodejs

Important: This is a fork from 'querymen'

https://github.com/diegohaz/querymen

Install

npm install --save querymen-custom

Examples

Pagination

Querymen has a default schema to handle pagination. This is the most simple and common usage.

var querymen = require('querymen');
 
app.get('/posts', querymen.middleware(), function(req, res) {
  var query = req.querymen;
 
  Post.find(query.query, query.select, query.cursor).then(function(posts) {
    // posts are proper paginated here
  });
});

User requests /posts?page=2&limit=20&sort=-createdAt req.querymen will be:

req.querymen = {
  query: {},
  select: {},
  cursor: {
    limit: 20, 
    skip: 20, 
    sort: {createdAt: -1}
  }
}

User requests /posts?q=term&fields=title,desc req.querymen will be:

When user requests /posts?q=term, querymen parses it to {keywords: /term/i}. It was designed to work with mongoose-keywords plugin, which adds a keywords field to schemas (check that out).

req.querymen = {
  query: {
    keywords: /term/i
  },
  select: {
    title: 1,
    desc: 1
  },
  cursor: {
    // defaults
    limit: 30, 
    skip: 0, 
    sort: {createdAt: -1}
  }
}

User requests /posts?fields=-title&sort=name,-createdAt req.querymen will be:

req.querymen = {
  query: {},
  select: {
    title: 0
  },
  cursor: {
    limit: 30, 
    skip: 0, 
    sort: {
      name: 1,
      createdAt: -1
    }
  }
}

Custom schema

You can define a custom schema, which will be merged into querymen default schema (explained above).

var querymen = require('querymen');
 
app.get('/posts', querymen.middleware({
  after: {
    type: Date,
    paths: ['createdAt']
    operator: '$gte'
  }
}), function(req, res) {
  Post.find(req.querymen.query).then(function(posts) {
    // ...
  });
});

User requests /posts?after=2016-04-23 req.querymen will be:

req.querymen = {
  query: {
    createdAt: {$gte: 1461369600000}
  },
  select: {},
  cursor: {
    // defaults
    limit: 30, 
    skip: 0, 
    sort: {createdAt: -1}
  }
}

Error handling

// user requests /posts?category=world
var querymen = require('querymen');
 
var schema = new querymen.Schema({
  category: {
    type: String,
    enum: ['culture', 'general', 'travel']
  }
});
 
app.get('/posts', querymen.middleware(schema));
 
// create your own handler
app.use(function(err, req, res, next) {
  res.status(400).json(err);
});
 
// or use querymen error handler
app.use(querymen.errorHandler())

Response body will look like:

{
  "valid": false,
  "name": "enum",
  "enum": ["culture", "general", "travel"],
  "value": "world",
  "message": "category must be one of: culture, general, travel"
}

Contributing

This package was created with generator-rise. Please refer to there to understand the codestyle and workflow. Issues and PRs are welcome!

License

MIT © Diego Haz

Package Sidebar

Install

npm i querymen-v2

Weekly Downloads

1

Version

2.1.5

License

MIT

Unpacked Size

31.7 kB

Total Files

7

Last publish

Collaborators

  • akash-gupta