[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)
})
分类:
Node.js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-08-23 [React] Use react styled system with styled components
2019-08-23 [Cypress] install, configure, and script Cypress for JavaScript web applications -- part4
2018-08-23 [Debug] Inspect and Style an Element in DevTools that Normally Disappears when Inactive
2017-08-23 [Web Security] JSON Hijacking
2017-08-23 [Angular] Progress HTTP Events with 'HttpRequest'
2017-08-23 [RxJS] How To get the results of two HTTP requests made in sequence
2017-08-23 [RxJS] Avoid mulit post requests by using shareReplay()