Part 2マングローブのマングローブのモデル作成


このプロジェクトの完全なコードベースはTHIS あなたはむしろ、この全体のチュートリアルを読むよりも周りを突くだろう.
__
つの部分シリーズの概要は、ここにあります.ボールドのステップは、この2番目の割賦でカバーされます.
  • パッケージマネージャーを使用したフォルダの初期化
  • 必要な依存関係を追加する(そしてそれぞれの目的を議論する)
  • MongoDBへの接続の確立Atlas
  • Expressアプリケーションの作成とローカルポートの選択
  • モデルの作成
  • そのモデルのためのCRUDルートを作成する
  • 郵便または不眠症のようなAPIテスターでコードをテストする
  • ここで我々が最後のポストでやめたところで、あなたは、この点で、AtlasウェブサイトでホストされるMongoDBデータベースと成功した接続を持っていなければなりません.生きている時間.

    モデルの作成


    組織的に、それはあなたにこのアプリの中にあなたのファイルを配置する方法です.この種のバックエンドは、Ruby on Railsのようなものとして独創的ではありません.ですから、その構造でもう少し自由にすることができます.
    私のファイルプロジェクトを整理するために、私は別のフォルダに関連するアイテムを維持したいので、最初に新しいフォルダを作成しますmodels , ファイルをネストするuser.model.js インサイドオブ.
    これは、我々がMongoDBの我々のデータベースに写像しようとするデータモデルの要件を定義するところです.我々は我々のExpressアプリと我々のデータベースの間のメッセンジャーとしてマングースライブラリを使用していることを忘れないでくださいので、このファイルの中で行う最初のものは、mongooseを必要とし、mongooseライブラリのスキーマクラスをつかむ.
    const mongoose = require('mongoose')
    const Schema = mongoose.Schema
    
    スキーマクラスの新しいインスタンスを作成することで、ユーザーモデルの書式を作成できます.
    const userSchema = new Schema()
    
    スキーマの最初の引数は、データモデルの属性を含むオブジェクトです.私たちのユーザーモデルには3つの属性があります:ユーザ名、電子メール、および年齢(オプションです).それぞれの属性はkey : value pairを使用して定義されます.キーは属性の名前であり、値はその型です.からのすべての利用可能なスキーマの種類をチェックアウトすることができますTHIS ページ.文字列と数値型が必要です.
    const userSchema = new Schema({
        username: String,
        email: String,
        age: Number
    })
    
    これ自体が機能するが、我々は年齢がオプションであることを覚えています.まあ、良いニュース、それはすでにです.各モデル属性集合のデフォルトrequired to false . したがって、年齢がオプションであると指定するのではなく、ユーザ名とメールがないことを指定すべきです.
    const userSchema = new Schema({
        username: { type: String, required: true },
        email: { type: String, required: true },
        age: Number
    })
    
    属性の詳細を指定する完全なオブジェクトに任意の属性の値を開くことができます.あなたが18歳以上でない限り、楽しみのために、あなたは我々のアプリを使うことができないと言います.
    const userSchema = new Schema({
        username: { type: String, required: true },
        email: { type: String, required: true },
        age: { type: Number, min: 18 }
    })
    
    検証:そのように簡単.ユーザーモデルのインスタンスを作成すると、入力スキーマが要件を満たすように、このスキーマを実行します.
    最後のステップは、mongooseを持つデータモデルとしてこのスキーマを固化し、このファイルからそれをプロジェクトの他の分野で使用するためにエクスポートすることです.
    const User = mongoose.model('User', userSchema)
    module.exports = User
    
    今、我々はユーザーのためのいくつかのCRUDルートを作ることに移動することができます.

    CRUDルートの作成


    私の組織の選択に合わせて、フォルダを作成しますcontrollers ファイルを格納するuser.controller.js . これはユーザモデルを含む活動のいずれかを作る中心ハブです予測するには、モデルインスタンスを作成、読み取り、更新、または削除しようとするとどうなるかを制御します.
    このファイルにインポートするには2つの必須項目があります.ユーザーモデルがここで繰り返し必要とされるので、我々はそれを必要とします.加えて、我々はローカルポートに住んでいるいくつかのルートを定義するためにExpressを使用します.
    const User = require('../models/user.model')
    const router = require('express').Router()
    
    ルータのインポートを見てみてください--ルータを必要とする度に、あなたは関数を呼び出しています.この関数は、このファイル内のルータの全く新しいインスタンスを生成します.それで、1つ以上のモデルがあるなら、私たちはそのコントローラ・ファイルの中に同じコードを持っています、しかし、他のルータ・オブジェクトは全く異なります.私たちは、ルータのこのインスタンスにいくつかの変更を定義し、ユーザーモデルに固有のものとして定義します.次に、我々のExpressアプリの残りのために、ルータのこのインスタンスをエクスポートします.
    と言うと、我々は必要なルートのボイラー板を横たえ、下にエクスポートしてみましょう.
    router.route('/new').post()
    
    router.route('/').get()
    
    router.route('/delete/:id').delete()
    
    router.route('/update/:id').put()
    
    module.exports = router
    
    今、我々はそれらのルートをカスタマイズすることができます.ルータへのパスを最初にパスしなければならないことに注意してくださいroute 次に、どの方法のHTTPメソッドをそのパスに対して行うかを明確にします.最初のケースではpost , つの引数を受け付けます.このパスがヒットしたときに実行する関数です.それぞれのルートの機能をこのルータでカプセル化することができるように、匿名関数を使用します.ルートコール.
    router.route('/new').post((req, res)=>{
    
    })
    
    この関数は自動的にいくつかの引数を渡します.req ) 情報と応答res ) インフォメーション.要求はあなたのフロントエンド(または郵便配達人/不眠症)から来ます、そして、反応はあなたのバックエンドが応答で送るべきです.各引数には組み込みの機能があります.あなたが前にポストリクエストをしたならば、あなたはフォーマットに精通していなければなりません.あなたのフロントエンドはあなたのバックエンドに要求をし、それを送るbody データベースに投稿する情報を含む属性.The body 属性は以下のようになります.{ username: "Hal", email: "[email protected]", age: 247 } . この情報を使用して、ユーザーモデルの新しいインスタンスを作成します.
    router.route('/new').post((req, res)=>{
        const newUser = new User(req.body)
    })
    
    この行は、私たちのMongoDBデータベースに受け入れられるべき何かを作成するために私たちのマングースモデルを使用します.次のステップは実際にデータベースに連絡し、新しいインスタンスを保存しようとすることです.
    router.route('/new').post((req, res)=>{
        const newUser = new User(req.body)
    
        newUser.save()
            .then(user => res.json(user))
    })
    
    データベースのエントリが成功したと仮定して、MongoDBは、新しく鋳造されたユーザを私たちに送ります.このユーザーインスタンスと作成した1つのキーの違いがありますnewUser -- MongoDBから返されたユーザはIDを持っています.このユーザインスタンスに対して、他のすべての操作を行う必要があります.この検証されたユーザーインスタンスを受信すると、行を使用しますres.json(user) レスポンスのJSONをユーザ自身で満たすことでサイクルを完了します.
    我々が書いたコードは機能しなければならないが、それは少し虚弱です.私たちの新しいユーザーがデータベースによって拒絶される場合には、我々は取り扱いませんでした.では、いくつかのエラー処理を移動する前に追加しましょう.
    router.route('/new').post((req, res) => {
        const newUser = new User(req.body)
    
        newUser.save()
            .then(user => res.json(user))
            .catch(err => res.status(400).json("Error! " + err))
    })
    
    我々がそれを書き出した今、我々がそれをテストすることができる前に、もう一つのステップがあります.今のところ、我々は内部で作成したExpressアプリserver.js 我々が作ったこれらのモデルまたはコントローラファイルについて何も知りません.それで、我々はサーバーに戻って、我々の新しいコードについてそれを言う必要があります.
    // inside server.js
    const userRoutes = require('./controllers/user.controller')
    app.use('/users', userRoutes)
    
    アプリケーションが'/user 'を使用するべきであることを指定することによって、私たちは'/user 'リソースの下でユーザコントローラで定義されているどんなルートもネストすることができます.したがって、新しいユーザを作成する場合には、フロントエンドは'http://localhost:5000/users/new '.
    そして今、我々はそれをテストすることができます!

    郵便または不眠症のようなAPIテスターでコードをテストする


    私はこれらのアプリの両方を使用して、それぞれ均等にそれらをお楽しみください.どちらの方法も支持.彼らは物事を行う.
    HERE 郵便配達人テスターへのリンクHERE 不眠症1へのリンクです.
    今、私は不眠症を使用して、名前はクールだ.一旦あなたがすべてのテスターにログインしたならば、あなたは新しい要求を作成しなければなりませんhttp://localhost:5000/users/new リソースセクションに、body型のjsonを選択します.それから、あなたは体に若干の生のJSONを加えることができますbody あなたのフロントエンドが送る部分.だからもう一度{ username: "Hal", email: "[email protected]", age: 247 } . その後、リクエストを送信!すべてが正しく設定されているなら、以下のような応答を見るべきです:

    私たちはIDを得た!大成功.
    このルートの完成で、我々は働く男性バックエンドを持っています.もちろん、我々は他のCRUDルートを記入する必要がありますが、そのエキスプレス、MongoDB、およびマングースを確保するための最も困難な仕事はきれいにチャットできます.今では、水の回転ガラスの別の良い時期かもしれない.
    残りのルートは単に最初のもののバリエーションなので、全体として見ることができます.
    router.route('/').get((req, res) => {
        // using .find() without a parameter will match on all user instances
        User.find()
            .then(allUsers => res.json(allUsers))
            .catch(err => res.status(400).json('Error! ' + err))
    })
    
    router.route('/delete/:id').delete((req, res) => {
        User.deleteOne({ _id: req.params.id })
            .then(success => res.json('Success! User deleted.'))
            .catch(err => res.status(400).json('Error! ' + err))
    })
    
    router.route('/update/:id').put((req, res) => {
        User.findByIdAndUpdate(req.params.id, req.body)
            .then(user => res.json('Success! User updated.'))
            .catch(err => res.status(400).json('Error! ' + err))
    })
    
    注意すべき事項
  • REQにアクセスすることで、リクエストURLからIDを取得できます.パーム
  • UPDATEメソッドはフロントエンド要求にidから離れたすべてのフィールドの情報を含める必要があります
  • フロントエンドに返信された応答を完全に制御できます.セキュリティ上の理由からサーバエラーを隠そうとするならば、あなたがしなければならないことはcatch 返します.
  • そしてそれです.征服男性におめでとう!