ノードのExpress 4 xスケルトンの詳細

15184 ワード

週末、用事がなければ会社に残業してエクスプレスを研究し続けるのも、独身犬の生活かもしれません.
1、ディレクトリ構造:
  • bin、起動項目のスクリプトファイル
  • を格納
  • node_modules、プロジェクトのすべての依存ライブラリ、packageを保存します.jsonにインストールされているモジュールはpackageにあるときです.jsonは依存するモジュールを追加してインストールした後、このフォルダの下に
  • 保存します.
  • public,静的ファイル(css,js,img)
  • routes,ルーティングファイル(MVCのC,controller)
  • views,ページファイル(jadeテンプレート)、後期にEjsテンプレートに変えようと
  • package.json,エンジニアリングの情報およびモジュール依存
  • を格納する.
  • app.js,アプリケーションコアプロファイル(エントリファイル)
  •  
    2、Package.json
    package.jsonはプロジェクト依存構成および開発者情報に使用され、scriptsプロパティは操作コマンドを定義するために使用され、デフォルトのstartなどの起動コマンドを簡単に追加できます.npm startでnode./を実行することを表します.bin/wwwコマンド.dependenciesに依存モジュールを追加すると、npm installを実行し、npmは現在のディレクトリのpackageをチェックする.json、指定したすべてのモジュールを自動的にインストールします.
    {
      "name": "myapp",
      "version": "0.0.0",
      "private": true,
      "scripts": {
        "start": "node ./bin/www"
      },
      "dependencies": {
        "body-parser": "~1.13.2",
        "cookie-parser": "~1.3.5",
        "debug": "~2.2.0",
        "express": "~4.13.1",
        "jade": "~1.11.0",
        "morgan": "~1.6.1",
        "serve-favicon": "~2.3.0"
      }
    }

    3、app.js
    コアファイルは、プロジェクトエントリファイルでもあります.
    var express = require('express');
    //
    var path = require('path');  
    //      
    var favicon = require('serve-favicon');  
    //     ,  req     
    var logger = require('morgan'); 
    //  cookie  ,    web      cookie    
    var cookieParser = require('cookie-parser'); 
    //        body    ,    JSON    ,url               
    var bodyParser = require('body-parser');  
    
    var routes = require('./routes/index');
    var users = require('./routes/users');
    var demo = require('./routes/demo');
    
    var app = express();  //    express   app
    
    
    //  VIEWS   ,__dirname node.js       。    js     
    app.set('views', path.join(__dirname, 'views'));
    //       
    app.set('view engine', 'jade');
    
    
    //   icon  ,        。     ,     express  
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    
    //
    app.use(logger('dev'));
    
    //    json    ,  json   
    app.use(bodyParser.json()); 
    
    //    urlencoded       
    app.use(bodyParser.urlencoded({ extended: false })); 
    
    //    cookie    
    app.use(cookieParser());  
    
    //        ,  public             
    app.use(express.static(path.join(__dirname, 'public')));
    //app.use(express.static(path.join(__dirname, 'html')));
    
    //     
    app.use('/', routes);
    app.use('/users', users);
    app.use('/demo',demo);
    
    //   404  ,         
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    // error handlers
    
    //       500     ,       error          
    if (app.get('env') === 'development') {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      });
    }
    
    //            ,       error          
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {}
      });
    });
    
    //  app         
    module.exports = app;

    4、Bin/wwwファイル
    wwwファイル内容:httpサーバの基本構成があり、wwwファイルもnodeのスクリプトであり、構成と起動プログラムを分離するために使用されます.コードは次のとおりです.
    #!/usr/bin/env node  //    node      
    
    /**
     * Module dependencies.
     */
    //    
    //         app  
    var app = require('../app');
    
    //  debug  ,      
    var debug = require('debug')('myapp:server');
    var http = require('http');
    
    /**
     * Get port from environment and store in Express.
     */
    //      
    var port = normalizePort(process.env.PORT || '3000');
    app.set('port', port);
    
    /**
     * Create HTTP server.
     */
    
    var server = http.createServer(app);
    
    /**
     * Listen on provided port, on all network interfaces.
     */
    
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
    
    /**
     * Normalize a port into a number, string, or false.
     */
    //       
    function normalizePort(val) {
      var port = parseInt(val, 10);
    
      if (isNaN(port)) {
        // named pipe
        return val;
      }
    
      if (port >= 0) {
        // port number
        return port;
      }
    
      return false;
    }
    
    /**
     * Event listener for HTTP server "error" event.
     */
    //HTTP        
    function onError(error) {
      if (error.syscall !== 'listen') {
        throw error;
      }
    
      var bind = typeof port === 'string'
        ? 'Pipe ' + port
        : 'Port ' + port;
    
      // handle specific listen errors with friendly messages
      switch (error.code) {
        case 'EACCES':
          console.error(bind + ' requires elevated privileges');
          process.exit(1);
          break;
        case 'EADDRINUSE':
          console.error(bind + ' is already in use');
          process.exit(1);
          break;
        default:
          throw error;
      }
    }
    
    /**
     * Event listener for HTTP server "listening" event.
     */
    //      
    function onListening() {
      var addr = server.address();
      var bind = typeof addr === 'string'
        ? 'pipe ' + addr
        : 'port ' + addr.port;
      debug('Listening on ' + bind);
    }

    5、routes
    ホームページにアクセスするGET要求をキャプチャするためのルーティング例を生成し、このルーティングを導出app.jsではapp.use('/', routes); ロードします.これにより、ホームページにアクセスするとres.render('index',{title:'Express'})が呼び出されます.レンダリングviews/index.JAdeテンプレートをブラウザに表示します.
    var express = require('express');
    var router = express.Router();
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
    });
    
    module.exports = router;

    ルーティングについて、ルーティングには2つの一般的な機能があります.
  • app.route()関数は、リンク可能なパスハンドラのルーティングパスを作成します.
  • express.Routerクラスは、モジュール化されたインストールパスのハンドラを作成します.

  • app.routeメソッドは、get、post、all、put、delete、headなど、すべてのHTTPメソッドを引き続き使用できるRouteインスタンスを返します.
    1 app.route('/users')
    2   .get(function(req, res, next) {})
    3   .post(function(req, res, next) {})

    express.Routerクラスは、より良い組織コード構造を支援します.app.jsファイルではappが定義.use(‘/’, routes); routesはroutesディレクトリの下にあるindexを指す.jsファイル、./routes/index.jsファイル、express.Routerは定義されて使用され、パス/*の処理はroutes/indexによって行われる.jsファイルのRouterが処理します.異なるパスを管理する場合は、複数の異なるRouterに直接構成できます.
    1 app.use('/user', require('./routes/user').user);
    2 app.use('/admin', require('./routes/admin').admin);
    3 app.use('/', require('./routes'));

     
    Expressで生成されたスケルトンのほとんどの内容はよくわかりません.次は小さなdemoを書いて、実践してみましょう.