Использование пакета shorttid для mongoose с функцией заполнения и равенства, более коротких удобочитаемых URL-адресов и более коротких идентификаторов - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу использовать пакет shorttid из npm с mongoose, но мне хотелось бы знать, можно ли использовать equals () и как я могу встраивать только идентификаторы, например, у меня есть пользователь, и я хочу сохранить его вСхема пользователя все понравившиеся сообщения (favShort в моей схеме), а затем заполнить их.Это моя схема, которая использует идентификатор объекта для заполнения.Краткая ссылка на пакет https://www.npmjs.com/package/mongoose-shortid

  _id: {
    type: String,
    default: shortid.generate,
  },
  username: {
    type: String,
    lowercase: true,
    unique: true,
    required: true,
  },
  password: {
    type: String,
  },
  showNsfw: { type: Boolean, default: true },
  timezone: { type: String, default: 'CEST' },
  favShort: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Shortcut',
  }],
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true,
  },
  permissionLevel: { type: Number, default: 1 },
  role: {
    type: String,
    enum: ['member', 'moderator', 'premium', 'admin'],
    default: 'member',
  },
  country: String,
},
{
  timestamps: true,
}); ```

1 Ответ

0 голосов
/ 21 сентября 2019

Ответ


Я не уверен, будет ли это кому-нибудь полезной, но я все равно опубликую

Я использовал наноид *Пакет 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(),
      });
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...