Ответ
Я не уверен, будет ли это кому-нибудь полезной, но я все равно опубликую
Я использовал наноид *Пакет 1007 * для идентификаторов и для слагов, я использовал плагин для mongoose mongoose-slug-plugin
Для ссылок из другой коллекции при использовании пакета Nanoid makeвведите строку
favShort: [{
type: String,
ref: 'Shortcut',
}],
Мой код
Модель
const mongooseSlugPlugin = require('mongoose-slug-plugin');
const mongoose = require('mongoose');
const nanoid = require('nanoid');
const postsSchema = new mongoose.Schema({
_id: {
type: String,
default: () => nanoid(),
},
title: String,
category: String,
Description: String,
className: String,
description: String,
date: { type: Date, default: Date.now },
hidden: { type: Boolean, default: true },
nsfw: { type: Boolean, default: false },
apps: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'App',
},
],
user: {
id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
},
username: String,
country: String,
},
meta: {
downloads: {
type: Number,
default: 0,
},
fav: {
type: Number,
default: 0,
},
views: {
type: Number,
default: 0,
},
},
versions: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Version',
},
],
lastUpdate: Date,
});
postsSchema.plugin(mongooseSlugPlugin, { tmpl: '<%=title%>' });
module.exports = mongoose.model('Post', postsSchema);
Маршрут
router.get('/posts/:slug', (req, res) => {
Post.findOne({slug: req.params.slug}).exec((err, f) => {
if (err || !f) {
console.log(err);
res.redirect('back');
} else if (f.versions.length === 0) {
if (req.user === undefined) {
res.redirect('back');
// eslint-disable-next-line no-underscore-dangle
} else if (f.user.id.equals(req.user._id)) {
res.render('posts/show', {
csrfToken: req.csrfToken(),
f,
});
} else {
res.redirect('back');
}
} else {
const fS = f;
if (req.cookies.cookieSeen === undefined) {
fS.meta.views += 1;
fS.save();
res.cookie('cookieSeen', fS._id, optionsCookie);
console.log(`set cookie and added views ${fS.meta}`);
} else {
console.log(`already seen this ${fS.title}`);
}
res.render('posts/show', {
f,
csrfToken: req.csrfToken(),
});
}
});
});