180 lines
5.1 KiB
Markdown
180 lines
5.1 KiB
Markdown
|
# mongoose-slug-generator
|
||
|
|
||
|
Mongoose plugin for creating slugs based on mongoose schema fields. For example you can create a slug based on a document's title and author's name: _my-post-title-kevin-roosevelt_, or unique slugs based on just the title: _my-post-title-Nyiy4wW9l_.
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
The best way to install it is using **npm**
|
||
|
|
||
|
```sh
|
||
|
npm install mongoose-slug-generator --save
|
||
|
```
|
||
|
|
||
|
## Loading
|
||
|
|
||
|
```js
|
||
|
var slug = require('mongoose-slug-generator');
|
||
|
```
|
||
|
|
||
|
## Initialization
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose');
|
||
|
mongoose.plugin(slug);
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
This plugin is based on the idea of using the **mongoose schema** as the way to check the use of slug fields.
|
||
|
|
||
|
The plugin checks and updates automatically the *slug field* with the correct slug.
|
||
|
|
||
|
### Basic Usage
|
||
|
|
||
|
If you only want to create the slug based on a simple field.
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose'),
|
||
|
slug = require('mongoose-slug-generator'),
|
||
|
mongoose.plugin(slug),
|
||
|
Schema = mongoose.Schema,
|
||
|
schema = new Schema({
|
||
|
title: String,
|
||
|
slug: { type: String, slug: "title" }
|
||
|
});
|
||
|
```
|
||
|
|
||
|
|
||
|
### Multiple slug fields
|
||
|
|
||
|
You can add as many slug fields as you wish
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose'),
|
||
|
slug = require('mongoose-slug-generator'),
|
||
|
mongoose.plugin(slug),
|
||
|
Schema = mongoose.Schema,
|
||
|
schema = new Schema({
|
||
|
title: String,
|
||
|
subtitle: String,
|
||
|
slug: { type: String, slug: "title" },
|
||
|
slug2: { type: String, slug: "title" },
|
||
|
slug3: { type: String, slug: "subtitle" }
|
||
|
});
|
||
|
```
|
||
|
|
||
|
|
||
|
### Multiple fields to create the slug
|
||
|
|
||
|
If you want, you can use more than one field in order to create a new slug field.
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose'),
|
||
|
slug = require('mongoose-slug-generator'),
|
||
|
mongoose.plugin(slug),
|
||
|
Schema = mongoose.Schema,
|
||
|
schema = new Schema({
|
||
|
title: String,
|
||
|
subtitle: String,
|
||
|
slug: { type: String, slug: ["title", "subtitle"] }
|
||
|
});
|
||
|
```
|
||
|
|
||
|
|
||
|
### Unique slug field
|
||
|
|
||
|
To create a unique slug field, you must only add add the *unique: true* parameter in the path (also, this way the default mongo unique index gets created)
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose'),
|
||
|
slug = require('mongoose-slug-generator'),
|
||
|
mongoose.plugin(slug),
|
||
|
Schema = mongoose.Schema,
|
||
|
schema = new Schema({
|
||
|
title: String,
|
||
|
subtitle: String,
|
||
|
slug: { type: String, slug: ["title", "subtitle"], unique: true }
|
||
|
});
|
||
|
```
|
||
|
|
||
|
If _unique_ is set, the plugin searches in the mongo database, and if the slug already exists in the collection, it appends to the slug a separator (default: "-") and a random string (generated with the shortid module).
|
||
|
|
||
|
**example random**
|
||
|
|
||
|
```js
|
||
|
mongoose.model('Resource').create({
|
||
|
title: 'Am I wrong, fallin\' in love with you!',
|
||
|
subtitle: "tell me am I wrong, well, fallin' in love with you"
|
||
|
}) // slug -> 'am-i-wrong-fallin-in-love-with-you'
|
||
|
|
||
|
mongoose.model('Resource').create({
|
||
|
title: 'Am I wrong, fallin\' in love with you!',
|
||
|
subtitle: "tell me am I wrong, well, fallin' in love with you"
|
||
|
}) // slug -> 'am-i-wrong-fallin-in-love-with-you-Nyiy4wW9l'
|
||
|
|
||
|
mongoose.model('Resource').create({
|
||
|
title: 'Am I wrong, fallin\' in love with you!',
|
||
|
subtitle: "tell me am I wrong, well, fallin' in love with you"
|
||
|
}) // slug -> 'am-i-wrong-fallin-in-love-with-you-NJeskEPb5e'
|
||
|
```
|
||
|
|
||
|
Alternatively you can modify this behaviour and instead of appending a random string, an incremental counter will be used. For that to happen, you must use the parameter *slug_padding_size* specifying the total length of the counter:
|
||
|
|
||
|
**example counter**
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose'),
|
||
|
slug = require('mongoose-slug-generator'),
|
||
|
mongoose.plugin(slug),
|
||
|
Schema = mongoose.Schema,
|
||
|
schema = new Schema({
|
||
|
title: String,
|
||
|
subtitle: String,
|
||
|
slug: { type: String, slug: ["title", "subtitle"], slug_padding_size: 4, unique: true }
|
||
|
});
|
||
|
|
||
|
mongoose.model('Resource').create({
|
||
|
title: 'Am I wrong, fallin\' in love with you!',
|
||
|
subtitle: "tell me am I wrong, well, fallin' in love with you"
|
||
|
}) // slug -> 'am-i-wrong-fallin-in-love-with-you'
|
||
|
|
||
|
mongoose.model('Resource').create({
|
||
|
title: 'Am I wrong, fallin\' in love with you!',
|
||
|
subtitle: "tell me am I wrong, well, fallin' in love with you"
|
||
|
}) // slug -> 'am-i-wrong-fallin-in-love-with-you-0001'
|
||
|
|
||
|
mongoose.model('Resource').create({
|
||
|
title: 'Am I wrong, fallin\' in love with you!',
|
||
|
subtitle: "tell me am I wrong, well, fallin' in love with you"
|
||
|
}) // slug -> 'am-i-wrong-fallin-in-love-with-you-0002'
|
||
|
```
|
||
|
|
||
|
|
||
|
### Choose your own options
|
||
|
|
||
|
You can change any options adding to the plugin
|
||
|
|
||
|
```js
|
||
|
var mongoose = require('mongoose'),
|
||
|
slug = require('mongoose-slug-generator'),
|
||
|
options = {
|
||
|
separator: "-",
|
||
|
lang: "en",
|
||
|
truncate: 120
|
||
|
},
|
||
|
mongoose.plugin(slug, options),
|
||
|
Schema = mongoose.Schema,
|
||
|
schema = new Schema({
|
||
|
title: String,
|
||
|
subtitle: String,
|
||
|
slug: { type: String, slug: ["title", "subtitle"], unique: true }
|
||
|
});
|
||
|
```
|
||
|
|
||
|
You can find more options in the [speakingURL's npm page](https://www.npmjs.com/package/speakingurl)
|
||
|
|
||
|
## Support
|
||
|
|
||
|
This plugin is proudly supported by [Kubide](http://kubide.es/)
|
||
|
|