• [Express] Extends CrudController with Mongoose model


    Each model controller:

    import { crudControllers } from '../../utils/crud'
    import { Item } from './item.model'
    
    export default crudControllers(Item)

    You are able to override default methods from crudController:

    export default {
      ...crudControllers(Item),
      removeOne() {...}
    }

    model:

    查看代码
     import mongoose from 'mongoose'
    
    const itemSchema = new mongoose.Schema(
      {
        name: {
          type: String,
          required: true,
          trim: true,
          maxlength: 50
        },
        status: {
          type: String,
          required: true,
          enum: ['active', 'complete', 'pastdue'],
          default: 'active'
        },
        notes: String,
        due: Date,
        createdBy: {
          type: mongoose.SchemaTypes.ObjectId,
          ref: 'user',
          required: true
        },
        list: {
          type: mongoose.SchemaTypes.ObjectId,
          ref: 'list',
          required: true
        }
      },
      { timestamps: true }
    )
    
    // 1: means sorting order
    // order matters, list first, then name
    itemSchema.index({ list: 1, name: 1 }, { unique: true })
    
    export const Item = mongoose.model('item', itemSchema)

    CrudController:

    export const getOne = model => async (req, res) => {
      try {
        const doc = model
          .findOne({ createdBy: req.user._id, _id: req.params.id })
          .lean()
          .exec()
    
        if (!doc) {
          return res.status(400).end()
        }
    
        res.status(200).json({ data: doc })
      } catch (e) {
        console.error(e)
        res.status(400).end()
      }
    }
    
    const getMany = model => async (req, res) => {
      try {
        const docs = model
          .find({ createdBy: req.user._id })
          .lean()
          .exec()
    
        res.status(200).json({ data: docs })
      } catch (e) {
        console.error(e)
        res.status(400).end()
      }
    }
    
    export const createOne = model => async (req, res) => {
      const createdBy = req.user._id
      try {
        const doc = await model.create({ ...req.body, createdBy })
        res.status(201).json({ data: doc })
      } catch (e) {
        console.error(e)
        res.status(400).end()
      }
    }
    
    export const updateOne = model => async (req, res) => {
      try {
        const updatedDoc = await model
          .findOneAndUpdate(
            {
              createdBy: req.user._id,
              _id: req.params.id
            },
            req.body,
            { new: true }
          )
          .lean()
          .exec()
    
        if (!updatedDoc) {
          return res.status(400).end()
        }
    
        res.status(200).json({ data: updatedDoc })
      } catch (e) {
        console.error(e)
        res.status(400).end()
      }
    }
    
    export const removeOne = model => async (req, res) => {
      try {
        const removed = await model.findOneAndRemove({
          createdBy: req.user._id,
          _id: req.params.id
        })
    
        if (!removed) {
          return res.status(400).end()
        }
    
        return res.status(200).json({ data: removed })
      } catch (e) {
        console.error(e)
        res.status(400).end()
      }
    }
    
    export const crudControllers = model => ({
      removeOne: removeOne(model),
      updateOne: updateOne(model),
      getMany: getMany(model),
      getOne: getOne(model),
      createOne: createOne(model)
    })
  • 相关阅读:
    Block编程
    自己写Web服务器(续)
    C# 2.0对现有语法的改进
    使用CDN
    优化网站设计(一):减少请求数
    MongoDB Shell的使用
    memcache 和appfabric
    go语言中几个有趣的特性以及对go的看法
    bpm流程平台
    Socket编程 (异步通讯) (Tcp,Udp)Part2
  • 原文地址:https://www.cnblogs.com/Answer1215/p/16617498.html
Copyright © 2020-2023  润新知