全スタック開発学習(Node+Vue+Mongodb)(五)-汎用CRUDインタフェース
2413 ワード
前章ではプロジェクトでよく使われるCRUD操作とよくある問題をまとめましたが、それぞれ異なる内容を書くインタフェースが冗長すぎて、その機能がほぼ一致しているため、インタフェースを改造し、汎用的なCRUDインタフェースに変える必要があります.これにより、現在のエンドが異なる種類のインタフェースを要求する場合、モデルのタイプに応じて変換とマッチングを行うことができ、コードの重複度を大幅に低減することができる.
1基本的な考え方パスを変更する動的リソース となる.はインタフェースをカプセル化し、動的パラメータ を加える.伝達された動的パラメータによって対応するモデルファイルを検索し、元の固定モデル名が動的に取得する(フォーマットを変換する必要がある) を修正する.フロントエンドインタフェースは、バックグラウンドインタフェースと統一されたフォーマット に変更する.
2具体的な実現ルーティングインタフェースパス を変更する.パッケージインタフェースは/admin/api/rest/であり、動的パラメータを加えると、4番目のパラメータresource動的パラメータ である.は、伝達する動的パラメータによって対応するモデルファイルを検索し、元の固定モデル名が動的に取得する(変換が必要なフォーマット) フロントエンドインタフェースは、バックグラウンドインタフェースと統一するフォーマット に変更される.動的パラメータを取得してモデル名に変換するコードをミドルウェアに変換して新しいmiddleware/resourceを導入する.jsは、ミドルウェアresourceMiddleware()をパッケージ化し、appに をマウントします.
3その他の詳細動的パラメータおよびモデルネーミング仕様パス名(categories、小文字で負)=」モデル名(Category、大文字で単数)categories="Category 動的パラメータをモデル名に変換するには、単一複素変換npm i inflection を処理するためにinflectionをインストールする必要がある. Categoryの特殊性は、親を調べる必要があるリソースによっては、次のような修正が必要です
1基本的な考え方
2具体的な実現
/** **/
router.post('/categories( )',async(req,res)=>{...})
/** **/
router.post('/',async(req,res)=>{...}) //
router.put('/:id',async(req,res)=>{...}) // , id
app.use('/admin/api/rest/:resource',resourceMiddleware(),router)
const modelName=require('inflection').classify(req.params.resource)
req.Model=require(`../models/${modelName}`)
を修正し、すべてのモデル名をreqと置換.Model const model=await req.Model.create(req.body)
const model=await req.Model.findByIdAndUpdate(req.params.id,req.body)
await req.Model.findByIdAndDelete(req.params.id,req.body)
const model=await req.Model.findById(req.params.id)
...
const res= await this.$http.get('rest/categories')
module.exports=options=>{
return async(req,res,next)=>{
const modelName=require('inflection').classify(req.params.resource)
req.Model=require(`../models/${modelName}`) // Model
next()
}
}
3その他の詳細
const queryOptions={}
if(req.Model.modelName==='Category'){
queryOptions.populate='parent'
}
const items=await req.Model.find().setOptions(queryOptions).limit(100)
res.send(items)