将几个猫鼬模型重构为类似的集合

时间:2018-04-20 21:16:43

标签: node.js mongodb mongoose node-modules

除了语言之外,我有几个具有相同文档类型的集合。 让我们说imagesES,imagesEN,imagesFR等......

我只考虑定义一个模式,但也考虑使用参数获得正确集合的一个模型:

var mongoose = require('mongoose')
var Schema = mongoose.Schema
let authorSchema = require('./Authors').authorSchema

const  imageSchema = new Schema({
  authors: [authorSchema],
  status: Number, // published (1), unpublished (0)
  created: { type: Date, default: Date.now },
  lastUpdated: { type: Date, default: Date.now },
  license: {
    type: String,
    enum: ['Creative Commons BY-NC-SA'], //just one license right now
    default: 'Creative Commons BY-NC-SA'
  },
  downloads: {
    type: Number,
    default: 0
  },
  tags: [String]
})

module.exports = locale => {
  return mongoose.model('Image', imageSchema, `image${locale}`)
} 

但是在控制器中我应该要求控制器内的模型(当我知道语言环境时):

  getImageById: (req, res) => {
    const id = req.swagger.params.id.value
    const locale = req.swagger.params.locale.value
    const Images = require('../models/Images')(locale)
    Images.findOne({_id: id}).lean().exec( (err, image) => {

我不确定这是否正确,因为我得到的每个请求都必须要求模型模块(同步),或者我是否需要在函数中使用之前的所有不同模型。

const locales = ['es', 'en', 'fr']
const Images = []
locales.map(locale=>Images[locale] = require('../models/Images')(locale))

  getImageById: (req, res) => {
    const id = req.swagger.params.id.value
    const locale = req.swagger.params.locale.value
    Images[locale].findOne({_id: id}).lean().exec( (err, image) => {

1 个答案:

答案 0 :(得分:0)

最后,我就是这样解决的。它所说的象形图,可能是问题中的图像

const setPictogramModel = require('../models/Pictograms')
const languages = [
  'ar',
  'bg',
  'en',
  'es',
  'pl',
  'ro',
  'ru',
  'zh'
]
const Pictograms = languages.reduce((dict, language)=> {
  dict[language]= setPictogramModel(language)
  return dict
}, {})

module.exports = {
  getPictogramById: (req, res) => {
    const id = req.swagger.params.idPictogram.value
    const locale = req.swagger.params.locale.value
    // Use lean to get a plain JS object to modify it, instead of a full model instance
    Pictograms[locale].findOne({id_image: id}).exec( (err, pictogram) => {
      if(err) {
        return res.status(500).json({
          message: 'Error getting pictograms. See error field for detail',
          error: err
        })
      }
      if(!pictogram) {
        return res.status(404).json( {
          message: `Error getting pictogram with id ${id}`,
          err
        })
      }
      return res.json(pictogram)
    })
  },
相关问题