全スタック開発学習(Node+Vue+Mongodb)(五)-汎用CRUDインタフェース

2413 ワード

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