Node.js学習ノート(三)

35860 ワード

1 nodemonツールを使用してWebサーバを自動的に再起動する
1.1 nodemonの役割:現在のプロジェクト、ファイルの変化をリアルタイムで傍受することができる.ファイルの変化を傍受すると、nodemonツールは自動的にwebサーバを再起動し、最新のコードを有効にします.プログラマーが手動でサーバーを再起動する悩みを免れた.
1.2どのようにインストールするか:npm i nodemon-gグローバルインストールを実行すればよい.1.3使用方法:
nodemon .\01-express   art-template.js

2ノードでWebプロジェクトを開発するフレームワーク-express
定義(Expressとは何か):高速なウェブサイト開発フレームワークで、オリジナルのhttpモジュールをカプセル化し、より便利に使用できます.APIはより人間的です.
2.1 expressフレームワークの特徴
  • Nodeに基づく.jsプラットフォーム上にはhttpモジュールがさらにカプセル化されており、より使いやすく、より友好的なAPI
  • が提供されています.
  • Expressを使用してWebサイトを作成すると、オリジナルのhttpモジュールを使用するよりも便利です.
  • Expressは、オリジナルhttpモジュールのメソッドを上書きするのではなく、オリジナルメソッドに基づいて、より友好的なパッケージを作成し、ユーザーがより良い
  • を体験できるようにしました.
    2.2 expressフレームワークのインストールと基本的な使用
  • インストール:
  •  npm i express -S
    
  • 基本的なexpressサーバの作成:
  • //    expree     
    const express = require('express')
    //         
    const app = express()
    //        
    app.get('/',(req,res) => {
        // res.end('  !')  //end() http     ,express          
        res.send("  !") //express         
    })
    //      
    app.listen(3000,() => {
        console.log('server running at http://127.0.0.1:3000')
    })
    

    2.3 expressでのショートカット
  • res.send()
  • app.get('/',(req,res) => {
       res.send('Ok') //     
       res.send({name:'cc',age:16}) //   {"name":"cc","age":16} json  
       res.send(['  ','  ','   ']) //    ["  ","  ","   "]
       res.send(new Buffer('123'))  //             
    })
    
  • res.sendFile()
  • 注意:res.sendFile()はブラウザに静的ページを送信できます.
  • app.get('/',(req,res) => {
        //     :           
        // res.sendFile(path.join(__dirname,'./public/index.html'))
        //     :                        
        res.sendFile('./public/index.html',{root:__dirname})
    })
    app.get('/movie',(req,res) => {
        res.sendFile('./public/movie.html',{root:__dirname})
    })
    app.get('/about',(req,res) => {
        res.sendFile('./public/about.html',{root:__dirname})
    })
    

    2.4 expressを使用する.static()静的リソースの迅速な管理
    app.use(express.static('./public'))
    // app.use()         
    // express.static()               ,                       , express      ;
    app.use('/page',express.static('./public'))
        //  /page:          
    
    

    2.5 expressフレームワークのテンプレートエンジンの動的ページのレンダリングを設定する
  • ejsテンプレートエンジン
  • をインストール
    npm i ejs -S
    
  • 注意、テンプレートページの接尾辞名は、省略して書かないことができます!
  • //    app.set('view engine',       )
    app.set('view engine','ejs')
    //              app.set('views','           ')
    app.set('views','./ejs_pages')  //      
    app.get('/',(req,res) => {
        //    res.render,         
        res.render('index.ejs',{name:'cc',age:16,hobby:['  ','  ','   ']})
    })
    

    2.6 expressでart-templateを構成する
    cnpm i art-template express-art-template -S
    
    const artTemplate = require('express-art-template')
    //   :       art-template  express-art-template            
    // 1.  app.engine         (       ,artTemplate)
        //                           
    app.engine('html',artTemplate)
    // 2   app.set('view engine','        ')             
    app.set('view engine','html')
    // 3                        
    app.set('views','./art-pages')
    
    app.get('/',(req,res) => {
        res.render('index.html',{name:'cc',age:16,hobby:['  ','  ','   ']})
    })
    

    2.7 expressフレームワークで提供されたルートを使用して要求を配布する
  • ルーティングとは何か:ルーティングは対応関係である.
  • バックエンドルーティングとは、フロントエンドが要求するURLアドレスは、いずれもバックエンドの処理関数に対応しなければならない.このURLアドレスと処理関数との対応関係をバックエンドルーティングと呼ぶ.
  • ルーティングモジュール
  • を定義する.
          // 1.       router.js       
          const express = require('express')
          //       
          const router = express.Router()
        
          router.get('/', (req, res)=>{})
          router.get('/movie', (req, res)=>{})
          router.get('/about', (req, res)=>{})
        
          //       
          module.exports = router
    
  • ルーティングモジュール
  • を使用する.
          //          
          const router = require('./router.js')
          //    app.use()      
          app.use(router)
    

    2.8 Expressフレームワークにおけるミドルウェアの概念
  • ミドルウェア
  • とは
    定義:ミドルウェアは処理関数です.ただし、この関数は比較的特殊で、req,res,nextの3つのパラメータが含まれています.
    注意:ミドルウェアメソッドの3つのパラメータ:
  • req:リクエストオブジェクト;
  • res:応答オブジェクト;
  • next:next()は、次のミドルウェアメソッドを呼び出すことを示すように呼び出され得る.
  • Expressフレームワークにおけるミドルウェアの5種類の分類
  • アプリケーションレベルのミドルウェア:appにマウントされたミドルウェアapp.get(‘URLアドレス’,(req,res,next)=>{});
  • ルーティングレベルのミドルウェア:routerオブジェクトにマウントされたミドルウェアrouter.get(‘urlアドレス’,(req,res,next)=>{})
  • エラーレベルのミドルウェア:コールバック関数には、4つのパラメータappがあります.use((err, req, res, next)=>{})
  • 唯一内蔵ミドルウェア:express.static()
  • サードパーティミドルウェア:expressフレームワークではなく、プログラマが手動でインストールして使用する必要があるミドルウェア.body-parser解析postフォームデータ
  • const querystring = require('querystring');
    
    //           
    app.use((req,res,next) => {
        let dataStr = ''
        //               ,    req data  
        //  data   ,                    
        req.on('data',chunk => {
            dataStr += chunk
        })
    
        //   req   end  ,           
        req.on('end',() => {
            // console.log(dataStr) //username=cc&userage=12
            //    username=ls&password=123    ,
            //    { username: 'ls', password: 123 }
            // querystring.parse()     URL       dataStr          。
            const obj = querystring.parse(dataStr)
            
            req.body = obj
    
            //   :     ,         next(),             
            next()
        })
    })
    
    // get  
    app.get('/',(req,res) => {
        res.sendFile('./11-   index.html',{root:__dirname})
    })
    // post  
    app.post('/postdata',(req,res) => {
        res.send(req.body)   //{"username":"cc","userage":"123"}
    })
    

    2.9 Expressでのデータベース操作
  • MySqlデータベース環境
  • の構成
    npm i mysq
    
  • mysqlサードパーティモジュールの紹介と基本構成
  • // 1.  mysql  
    const mysql = require('mysql')
    // 2.  mysql     
    const conn = mysql.createConnection({
        host:'localhost',
        user:'root',
        password:'root',
        database:'express-mysql'
    })
    
  • mysqlサードパーティモジュールを使用してCRUD
  • を実現
  • クエリー
  • //   conn.query('sql  ',    )
    const sql ='SELECT * FROM `user` '
    conn.query(sql,(err,result) => {
        if(err) return console.log('      '+err.message)
        console.log(result) 
        //[ RowDataPacket { id: 1, name: 'cc', age: 16, gender: 'girl' } ]
    })
    
  • 新規
  • const user = {name:'zz',age:22,gender:'boy'}
    const sql = "INSERT INTO `user` SET ?"
    conn.query(sql,user,(err,result) => {
        if(err) return console.log('      '+err.message)
        console.log(result) 
        // OkPacket {
        //     fieldCount: 0,
        //     affectedRows: 1,
        //     insertId: 6,
        //     serverStatus: 2,
        //     warningCount: 0,
        //     message: '',
        //     protocol41: true,
        //     changedRows: 0 
        // }
    })
    
  • 修正
  • const user ={id:6,name:'zz',age:18}
    const sql = 'UPDATE `user` SET ? WHERE id = ?'
    // sql       ?   ,             ,     
    conn.query(sql,[user,user.id],(err,result) => {
        if(err) return console.log("      ")
        console.log(result)
        // OkPacket {
        //     fieldCount: 0,
        //     affectedRows: 1,
        //     insertId: 0,
        //     serverStatus: 2,
        //     warningCount: 0,
        //     message: '(Rows matched: 1  Changed: 1  Warnings: 0',
        //     protocol41: true,
        //     changedRows: 1 
        // }
    })
    
  • 削除
  • const sql = 'DELETE FROM `user` WHERE id=?'
    conn.query(sql, 1, (err, result) => {
        if (err) return console.log('    !' + err.message)
        console.log(result)
        // OkPacket {
        //     fieldCount: 0,
        //     affectedRows: 1,
        //     insertId: 0,
        //     serverStatus: 2,
        //     warningCount: 0,
        //     message: '',
        //     protocol41: true,
        //     changedRows: 0 
        // }
    })
    

    モジュールロードメカニズム
  • キャッシュから優先的にロード
  • .
  • モジュールが初めてrequireされると、モジュール内のコードが実行され、同じモジュールが2回目にロードされると、キャッシュから優先的に検索され、このようなモジュールがあるかどうかを確認します!
  • の利点:モジュールのロード速度を向上させる;モジュールを毎回再実行してロードする必要はありません.
  • コアモジュールのロードメカニズム
  • キャッシュを検索します.
  • キャッシュにない場合は、コアモジュールをロードします.
  • ユーザモジュールのロードメカニズム
  • キャッシュを検索します.
  • キャッシュにない場合、ユーザモジュールのロードを試みる.
  • ユーザモジュールのロード時に接尾辞名を省略すると、まず、指定する名前に厳格に従って検索し、次に、接尾辞名をロードしようとする.jsのファイルがない場合.jsのファイルは、ロードしようとします.jsonの最後のファイルがない場合.jsonのファイルは、ロードしようとします.Nodeの最後のファイル検索ルール:index->index.js -> index.json -> index.node
  • サードパーティモジュールのロードメカニズム【了解】
  • プロジェクトルートディレクトリでnode_を検索するmodulesフォルダ
  • node_modulesフォルダの下で、モジュール関連フォルダ
  • を検索
  • 対応するフォルダの下でpackageを検索します.jsonのファイル
  • packageを検索します.jsonファイルのmainプロパティ(モジュールのエントリファイルを指定)
  • mainプロパティが見つかった場合、mainプロパティで指定されたファイルパスが存在する場合、指定されたファイルモジュール
  • をロードしようとします.
  • にmain属性がない、またはmain属性に対応するファイルが存在しない、またはpackageがない.json、indexを順次ロードしようとします.js,index.json,index.node;
  • index関連のファイルがない場合、またはモジュール対応フォルダが指定されていない場合、または現在のプロジェクトルートディレクトリにnode_がありません.modulesフォルダでは、前の階層のディレクトリにnode_を検索します.modules、検索ルールは同じです!
  • 最後に、プロジェクトが存在するディスクのディスクルートディレクトリに対応するモジュールが見つからない場合は、エラー:cannot find module***