MongoDB+Express

75710 ワード

データベースの概念
  • のデータベースソフトウェアには複数のデータ倉庫が含まれてもよく、各データ倉庫には複数のデータセットが含まれてもよく、各データセットには複数の文書(具体的なデータ)
  • が含まれてもよい.
    専門用語
    説明する
    database
    データベース、monogoDBデータベースソフトウェアで複数のデータベースを構築することができます.
    コレクション
    セット、データのセットは、JavaScriptの配列として理解されます.
    document
    ドキュメント、データのデータは、JavaScriptのオブジェクトとして理解できます.
    field
    フィールド、ドキュメント内の属性名は、JavaScriptのオブジェクト属性として理解できます.
    モングDB
  • .node.jsでMongoDBデータベースを操作するにはnode.jsの第三者に依頼する必要があります.
  • npm install mongooseコマンドでWindowsをダウンロードし、MongoDB
  • を起動する.
  • コマンドラインツールでnet start mongoDBを実行すると、モンゴルDBが起動されます.そうでないと、モンゴルDBはデータベース接続
  • に接続できません.
    const mongoose = require('mongoose')
    mongoose.connect('moongodb://localhost/playground')
    .then(()=>{
         console.log('success')})
    .catch(err=>console.log('fail', err))
    
    データベースの作成
  • は、mongodbにデータベースの作成を表示する必要がありません.使用中のデータベースが存在しない場合、mongodbは自動的に
  • を作成します.
    MongoDB操作(添削・修正)
    セットを作成
  • のセットを作成するには、セット設定規則に応じて、20のセットを作成し、モングース.Schemaアーキテクチャ関数の例を作成すると、セット
  • を作成することができます.
    //       
    const courseSchema = new mongoose.Schema({
         
    	name: String,
    	author: String,
    	isPublish: Boolean
    })
    //         
    const Course = mongoose.model('Course', courseSchema)  // courses
    
    文書を作成
  • ドキュメントを作成すると、実際にはセットにデータを挿入します.
  • セット例
  • を作成する.
  • インスタンスオブジェクトのsave方法を呼び出して、データをデータベースに保存する方法1
  • .
    //       
    const course = new Course({
         
    	name:'Node.js course',
    	author: 'Billy',
    	isPublish: true
    })
    //            
    course.save()
    
    方法2
    Course.create({
         
    	name:'JavaScript  ',
    	author:'Billy',
    	isPublish: true
    },(err, doc)=>{
         
    	//     
    	console.log(err)
    	//        
    	console.log(doc)
    })
    ---------------------------
    Course.create({
         
    	name:'JavaScript  ',
    	author:'Billy',
    	isPublish: true
    })
    .then(doc=>console.log(doc))
    .catch(err=>console.log(err))
    
    monogoDBデータベース導入データ
  • mongoimport -d -c --file
  • mongodbデータベースのインストールディレクトリを見つけて、インストールディレクトリの下のbinディレクトリを環境変数に配置します.
    クエリードキュメント
    すべての文書を検索
    //         
    Course.find().then(result=>console.log(result))
    //       
    [{
         },{
         }]
    
    文書を検索
  • は、必要に応じた第1の文書
  • だけを返す.
    //         
    Course.findOne({
         name:'JavaScript  '})
    .then(res=>console.log(res))
    //     
    {
         }
    
    あいまい検索
    //        
    User.find({
         age:{
         $gt:20, $lt:50}}).then(res=>console.log(res))
    
    //     
    User.find({
         hobbies: {
         $in: ['   ']}}).then(res=>console.log(res))
    
    //         
    User.find().select('name email').then(res=>console.log(res))
    
    //             
    User.find().sort('age').then(res=>console.log(res))
    
    // skip        limit      
    User.find().skip(2).limit(2).then(res=>console.log(res))
    
    文書を削除
    //     
    Course.findOneAndDelete({
         }).then(res=>console.log(res))
    
    //     
    Course.deleteMany({
         }).then(res=>console.log(res))
    
    文書を更新
    //     
    User.updateOne({
             }, {
              }).then(res=>console.log(res))
    //     
    User.updateMany({
             },{
              }).then(res=>console.log(res))
    
    モングース検証
  • でセットルールを作成すると、現在のフィールドの検証ルールを設定できます.認証に失敗したら挿入失敗
  • を入力します.
  • required:true必須転送フィールド
  • minlength:3文字列の最大長さは2
  • です.
  • maxlength:20文字列の最大長さは20
  • です.
  • min:2値は最小で2
  • です.
  • max:100数値は最大100
  • です.
  • enum:['html','css','javascript','node.js']列挙(列挙されたデータのみ入力可能)
  • trim:trueは、文字列の両側のスペース
  • を除去する.
  • validate:カスタムベリファイア
  • default:デフォルト値取得エラー情報:error.errors[フィールド名].message
  • 集合関連
  • は、一般的に異なるセットのデータ間に関連があり、例えば、文章情報とユーザ情報は異なるセットに格納されているが、記事はあるユーザが発表したものであり、記事を検索するためのすべての情報は、発表ユーザを含む.集合関連付けが必要である.
  • は、idを使用して、集合を関連付ける
  • .
  • poputlate方法を用いて関連セットクエリ
  • を行う.
    //     
    const User = mongoose.model('User', new mongoose.Schema({
         
    	name: {
         
    		type: String
    	}
    }))
    //     
    const Post = mongoose.model('Post', new mongoose.Schema({
         
    	title: {
         
    		type: String
    	}
    	//   id              
    	author:{
         type:mongoose.Schema.Types.ObjectId, ref:'User'}
    }))
    //     
    Post.find().populate('author').then((err, result)=>console.log(result))
    
    テンプレートエンジン
  • コマンドラインツールにnpm install art-templateコマンドを使用してダウンロードする
  • は、const template = require('art-template')を使用してテンプレートエンジン
  • を導入する.
  • テンプレートエンジンに頼るべきデータとテンプレートはどこにあるか教えてください.
  • テンプレート文法を使用して、テンプレートとデータをテンプレートエンジンに教えます.
    //         
    const template = require('art-template')
    //               
    const html = template('./views/index.art', {
         
    	data: {
         
    		name:'  ',
    		age: 20
    	}
    })
    
    <div>
    	<span>{
        { data.name }}span>
    	<span>{
        { data.age }}span>
    div>
    
    テンプレート文法
    
    <h2>{
        {value}}h2>
    <h2>{
        {a?b:c}}h2>
    <h2>{
        { a + b}}h2>
    
    <h2>h2>
    <h2>h2>
    <h2>h2>
    
    原文出力
    
    <h2>{
        { @ value }}h2>
    
    <h2>h2>
    
    条件の判断
    
    {
        {if   }}.......{
        {/if}}
    {
        {if v1}}....{
        {else if v2}}....{
        {/if}}
    
      ...  
     ...  ... 
    
    ループ
    
    {
        { each target }}
    	{
        { $index }} {
        {$value}}
    {
        { /each }}
    
    
    	 
    
    
    サブテンプレート
    <!--    -->
    {
         {
          include './header.art' }}
    <!--    -->
    <% include('./header.art') %>
    
    テンプレートの継承
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Documenttitle>
        {
        {blcok 'head'}}
        {
        {/blcok}}
    head>
    <body>
        {
        {block 'content'}}
        {
        {/block}}
    body>
    html>
    
    
    
    {
        {extend './layout.art'}}
    {
        {blcok 'head'}}
    <link rel="stylesheet" href="index.css">
    {
        {/blcok}}
    {
        {blcok 'content'}}
    <p>this is the contentp>
    {
        {/blcok}}
    
    テンプレートの設定
  • 変数をテンプレートに導入するconst html = template( ', ')
  • テンプレートルートディレクトリtemplate.defaults.imports. =
  • を設定します.
  • テンプレートのデフォルトの拡張子template.defaults.root =
  • を設定します.
    Express
  • expressはnodeプラットフォームのwebアプリケーション開発の枠組みに基づいています.一連の強力な特性を提供しています.様々なWebアプリケーションを作成するのに役立ちます.
  • template.defaults.extname= '.art'コマンドを使用してexpressフレーム特性をダウンロードする
  • は、簡単なルーティング定義方式
  • を提供する.
  • は、HTTP要求パラメータの取得を簡略化処理した
  • を実行する.
  • テンプレートエンジンに対するサポートが高く、ダイナミックHTMLページ
  • をレンダリングしやすい.
  • は、中間部品機構の効果的な制御HTTP要求
  • を提供する.
  • 大量の第三中間部品を持っています.機能を拡張します.
    //   express  
    const express = require('express')
    //       web   
    const app = express();
    //      get       
    app.get('/', (req, res)=>{
         
    	//         
    	res.send('Hello Express')
    })
    //   3000  
    app.listen(3000)
    
    
    -------------------------
    //   express  
    const express = require("express");
    
    //        
    const app = express();
    
    app.get("/", (req, res) => {
         
      // send              
      // send       http   ;
      // send                 ;
      res.send({
          name: "Billy", age: 19 });
    });
    
    //     
    app.listen(3000);
    
    console.log("         ");
    
    中間部品
  • ミドルウェアは、クライアントからの要求を受信し、要求に応答しても良いし、要求を次のミドルウェアに引き継いで処理しても良いです.
  • ミドルウェアは主に二つの部分から構成され、ミドルウェア方法及び要求処理関数
  • 中間価格法はexpressによって提供され、ブロック要求を担当し、処理関数は開発者に提供され、処理要求
  • を担当する.
    app.get('    ', '    ')   //      get  
    app.post('    ', '    ')   //      post  
    
  • は、同じ要求に対して複数の中間部品を設定し、同じ要求に対して複数の処理を行うことができる
  • .
  • デフォルトの場合、要求は上から下へ順にミドルウェアにマッチングし、マッチングが成功すると、マッチングが終了する.
  • は、next方法を呼び出して、要求された制御権を次の中間件に渡すことができ、直接に終了要求の中間件
  • に遭遇する.
    app.get('/request', (req, res, next)=>{
         
    	req.name - 'zhangsan',
    	next()
    })
    app.get('/request', (req, res)=>{
         
    	res.send(req.name)
    })
    
    app.useの中間部品の使い方
  • npm install expressは、すべての要求方式に一致し、要求処理関数に直接に入ってきてもよく、すべての要求を受信することを表す
  • .
    app.use((req, res, next)=>{
         
    	console.log(req.url)
    	next()
    })
    
  • app.useの最初のパラメータは、要求アドレスにも入ることができ、どのような要求方法であれ、この要求アドレスであれば、この要求を受信する
  • を表す.
    app.use('/admin', (req, res, next)=>{
         
    	console.log(req.url)
    	next()
    })
    
    //   express  
    const express = require("express");
    
    //        
    const app = express();
    
    app.use((req, res, next) => {
         
      console.log("    app.use   ");
      next();
    });
    app.use("/request", (req, res, next) => {
         
      console.log("    app.use   /request   ");
      next();
    });
    
    app.get("/list", (req, res, next) => {
         
      req.name = "  ";
      next();
    });
    app.get("/request", (req, res) => {
         
      res.send(req.name);
    });
    //     
    app.listen(3000);
    
    console.log("         ");
    
    
    中間部品の応用
  • ルート保護は、クライアントがログインしたいページにアクセスする際に、まず中間部品を使ってユーザ登録状態を判断することができ、ユーザがログインしていない場合はブロック要求に直接応答し、ログインしたいインターフェース
  • にユーザが入ることを禁止する.
  • ウェブサイトのメンテナンス公告は、すべてのルートの一番上に、すべての要求を受信する中間部品を定義し、直接にクライアントに応答して、ウェブサイトはメンテナンス中です.
  • カスタム404ページエラー処理ミドル
  • プログラム実行中、ファイルの読み込みに失敗したなど、予期せぬエラーが発生することは避けられない.データベース接続失敗
  • .
  • エラー処理ミドルウェアはエラーを集中的に処理するところです.
    app.use((err, req, res, next)=>{
         
    	res.status(500).send('         ')
    })
    -----------------
    //   express  
    const express = require("express");
    
    //        
    const app = express();
    
    // app.use((req, res, next) => {
         
    //   res.send("      ");
    // });
    
    app.use("/admin", (req, res, next) => {
         
      let isLOgin = true;
      if (isLOgin) {
         
        next();
      } else {
         
        res.send("     ");
      }
    });
    
    app.get("/admin", (req, res) => {
         
      res.send("     ");
    });
    
    app.use((req, res, next) => {
         
    //   res.status(404);
      res.status(404).send("404");
    });
    //     
    app.listen(3000);
    
    console.log("         ");
    
    
  • プログラムにエラーが発生したら、next()メソッドを呼び出し、エラー情報をパラメータ形式でnext()メソッドに渡すと、エラー処理ミドル
  • をトリガすることができます.
    app.get('/', (req, res, next)=>{
         
    	fs.readFile('/file-docs-not-exist', (err, data)=>{
         
    		if(err){
         
    			next(err)
    		}
    	})
    })
    
    捕獲エラー
  • node.jsにおいて、非同期APIのエラー情報はすべてコールバック関数で取得され、Promiseオブジェクトをサポートする非同期APIにエラーが発生した場合、catch方式で
  • を捕捉することができる.
  • try catchは、非同期関数および他の同期コードの実行中に発生するエラーをキャプチャすることができるが、他のタイプのAPIによって発生するエラー
  • を捕捉することができない.
    app.get('/', async (req, res, next)=>{
         
    	try {
         
    		await User.find({
         name:'  '})
    	}catch(ex){
         
    		next(ex)
    	}
    })
    
    モジュール化ルート
    // home.js
    const home = express.Router()
    home.get('/index', ()=>{
         
    	res.send('welcome')
    })
    module.exports = home
    
    // app.js
    const home = require('./route/home')
    app.use('/home', home)
    
    GETパラメータの取得
  • Expressフレームではapp.useを使用してGETパラメータを取得でき、フレーム内ではGETパラメータをオブジェクトに変換して
  • に戻る.
    // http://localhost:3000/?name=zhangsan
    app.get('/', (req, res)=>{
         
    	console.log(req.query)  //{"name":"zhangsan"}
    })
    
    POSTパラメータの取得
    //   body-parse  
    const bodyParse = require('body-parse')
    //   body-parse  
    app.use(bodyParse.urlencoded({
         extended: false}))
    //     
    app.post('/add', (req, res)=>{
         
    	//       
    	console.log(req.body)
    })
    ----------------------------
    const express = require("express");
    const bodyParse = require("body-parser");
    const app = express();
    // extended:false      queryString           
    // extended:true           qs           
    app.use(bodyParse.urlencoded({
          extended: false }));
    
    app.post("/index", (req, res) => {
         
      console.log(bodyParse);
      // body  bodyParse req        ,        post    
      res.send(req.body);
    });
    
    app.listen(3000);
    
    Expressルーティングパラメータ
    // http://localhost:3000/find/123
    app.get('./find/:id', (req, res)=>{
         
    	console.log(req.params)  // {id: 123}
    })
    ------------------------
    const express = require("express");
    const bodyParse = require("body-parser");
    const app = express();
    
    app.get("/index/:id/:name/:age", (req, res) => {
         
      //       
      res.send(req.params);
    });
    
    app.listen(3000);
    
    
    静的リソース処理
  • は、Expressによって内蔵されたreq.queryによって、静的ファイルを簡単に管理することができ、例えば:img、CSS、JavaScriptファイル
  • app.use(express.static('public'))
    
    このように設定してから、publicディレクトリの下の公共静的資源ファイルにアクセスすることができます.
    express-art-templateテンプレートエンジン
  • art-templateテンプレートエンジンをより良いExpressフレームと組み合わせるために、テンプレートエンジンの公式は、元のart-templateテンプレートエンジンに基づいて、express-art-template
  • を実装しました.
  • express.static
  • を使用する.
    //       art    ,  express-art-template
    app.engine('art', require('express-art-template'))
    //         
    app.set('views', path.join(__dirname, 'views'))
    //          ,    art  
    app.set('view engine', 'art')
    app.get('/', (req, res)=>{
         
    	//     
    	res.render('index')
    })
    -------------------------------------
    const express = require("express");
    
    const path = require("path");
    
    const app = express();
    
    //   express                   
    //     
    //        
    
    app.engine("art", require("express-art-template"));
    
    //   express           ('views')        
    
    app.set("views", path.join(__dirname, "views"));
    
    //   express         
    app.set("view engine", "art");
    app.get("/index", (req, res) => {
         
      //   res.render("index.art");
      //       
      //        
      //                
      //            
      res.render("index", {
         
        msg: "message",
      });
    });
    
    app.listen(3000);
    
    
    app.locarsオブジェクト
  • は、すべてのテンプレートから
  • までの変数をap.localオブジェクトの下に設定します.
    app.locals.users = [{
         
    	name: '  ',
    	age: 20
    },{
         
    	name:'  ',
    	age: 40
    }]