nodejs中間層実践(express)

14996 ワード

何がnodejs中間層ですか?
フロントエンド---要求-->nodejs----要求-->バックエンド----応答-->nodejs--データ処理---応答-->フロントエンド.このような流れのメリットは、業務のロジックが多すぎたり、業務の需要が絶えず変更されたりした時に、フロントエンドが多すぎず、業務のロジックを変えて後端と低結合することです.フロントエンドが表示され、レンダリングされます.バックエンドはデータを取得して保存します.中間層はデータ構造を処理し、フロントエンドにレンダリング可能なデータ構造を返す.
nodejsは中間層としての役割を果たしています.即ち、クライアントの要求に応じて、相応の処理やレンダリングページを行います.処理時は、取得したデータを簡単な処理として、下の階のjava側に任せて、本当のデータの恒久化やデータの更新をしてもいいです.
プロジェクト構築:
1.技術選択型で、expressフレーム開発中間層を選択しました.
2.$ npm install express --save.expressパッケージをダウンロードする.
3.$npm install express-generator -gはexpressジェネレータを使用して、完成したプロジェクト構造を生成する.
3.$npm install pm2 -g pm 2アプリケーション全体をダウンロードする.
4.$pm2 start express /bin/www --watch expressプロジェクト、およびいくつかのファイルの変更を監督し、コードが変更されたら、自動的にnodejsサービスを再開します.
ミドルウェアの作成:
  • はディレクトリと一緒にファイルを作成して、自分で書いたミドルウェアを保存します.これはブロックとして使われます.
  • 6.この中間部品の作成を開始する:
    interceptor.js
    const log = require('../util/log');
    //  async 。
    const async = require('async'), 
          NO_TOKEN = [
            //     token   
            '/api/login'
          ],
          
          //    
          URL = require('../config');
    
    /*       */
    const interceptor = (req, res ,next) =>{
      res.result = {
        code: 200,
        data:""
      }
      console.log('    ');
      log.info("*********    **********");
      //log.info("HOST:" + req.headers.host);
      log.info("Authorization:" + req.headers['authorization']); 
      // res.send('**********repoert******');
    
      try {
        console.log('   ');
        const origina_url = req.originalUrl;
        const method = req.method;
        log.info(origina_url);
        log.info(method);
        let count = 0,    //       
            matchUrl = {};  //          
        // if(NO_TOKEN.indexOf(origina_url) < 0){
        //   if(req.headers){
        //     if(!req.headers['authorization'] || req.headers['authorization'] == ''){
        //       log.warn('    token     ');
        //       console.log('    token     ');
        //       res.result['code'] = 403;
        //       // next();
        //       return;
        //     }
        //   }
        // }
        log.info(`   token`);
        log.info(req.query);
        //   : url+      +   
        for(let i = 0; i < URL.length; i++){
          
          let el = URL[i],
            url = el['url'],
            type = el['type'];
            log.info(url);
            log.info(method);
            log.info(type);
            log.info(url.test(origina_url));
            
            if(url.test(origina_url) && type.test(method)){
              log.info('     ')
              //  post   ,      
              if(method !== 'GET'){
                let init_params = el['params'],
                  init_params_length = init_params.length,
                  request_params = Object.keys(req.body),
                  request_params_length = request_params.length;
                
                  //                   ,        
                if(request_params_length !== init_params_length){
                  log.warn("                    :" + request_params_length + " --- " + init_params_length);
                  console.log("                    :" + request_params_length + " --- " + init_params_length);
                  continue;
                }
                
                //        0                    
                //        0,   post        ,   get     
                if(init_params_length !== 0){
                  let params_count = 0; //        
    
                  for(let sub_i = 0; sub_i < request_params_length; sub_i++){
                    let item = request_params[sub_i];
    
    
                    //                   ,     ++;
                    if(init_params.indexOf(item) != -1){ 
                      params_count++;
                    }
                  }
    
                  //                    ,        
                  if(params_count !== init_params_length){
                    log.info('==========                ========== ');
                    log.info('    :' + request_params);
                    log.info('    :' + init_params);
                    log.info(' ==========                ========== ');
                    continue;
                  }
                  
                }
                
              }
              count++;
              matchUrl = el;
    
              break;
            } else {
              console.log('     ');
              log.info('     ');
            }
        }
    
        //        0,      
    
        if(count > 0){
          log.info('      :' + matchUrl.name);
          
          //       
          let request_params = JSON.stringify(method == "GET" ? req.query : req.body);
    
          //        
          let target = matchUrl['target'],
            target_length = target.length;
    
          //async      
          if(target_length > 0){
            let async_func = [
              function (cb){
                let _params = JSON.parse(request_params);
                
                log.info('    :'+ request_params);
    
                //        token ,         token;
                req.headers['authorization'] ? 
                function(){
                  log.info('    token:' + req.headers['authorization']);
                  _params['authorization'] = req.headers['authorization'];
                }() : function(){
                  log.info('    token')
                }();
                
                cb(null, _params);
              }
            ].concat(target);
            
            log.info(target);
            async_func = async_func.concat([
              function(data,cb){
                log.info('      :'+ JSON.stringify(data));
    
                cb(null, data);
              }
            ]);
    
            //waterfall:            。        ,       。
            async.waterfall(async_func, (err, resultend)=>{
              if(err){
                res.result['code'] = err['httpStatus'];
                next();
              }
              res.result['code'] = 200;
              res.result['data'] = resultend;
              next();
            })
          }
        }
      }
      catch(err){
        log.error('======== NODE       =========');
        log.error(err);
        let errCode = err.statusCode;
        switch(errCode){
          case 400:
            res.result['code'] = 400;
          break;
          default:
            res.result['code'] = 500;
        }
        next();
      }
    }
    module.exports = interceptor;  
    
    
    インターフェースリストの区分:
  • 分割インターフェースリスト:
  • index.js
    const $http = require('../util/superagent');
    const ENV = require('../config/url.config')
    let login = [];
    login = [
      {
        //      
        name: '  ',
        //        
        url: /^\/list\/login$/i,
        
        //    
        type: /^post$/i,
        //    
        params: ['memberCellphone', 'loginPwd'],
        //        
        target:[
          function(initParam, cb){
            let headers = {
              "Content-Type":"application/json;",
              
            }
            $http('http://webapi.test.sxmaps.com/' + 'sapp/sapp-api/notfilter/member/login', 'post',initParam,{},function(err,res){
              if(err){
                cb(err,{});
                return false;
              }
              //             ,          
              let res_data = res;
              cb(null, JSON.parse(res_data.text));
            })
            
          }
        ]
      }
    ]
    module.exports = login;
    
    8.httpファイルのパッケージ.本明細書ではsuperagentライブラリを使用する.
    superagentは、軽量級、柔軟的、読みやすい、低学習曲線のクライアント要求エージェントモジュールであり、NodeJS環境において使用される.superagent:visionmedia.github.io/superagent/
    
    //
    const superagent = require('superagent');
    const NODE_ENV = process.env.NODE_ENV;
    // module.exports = superagent
    
    /**
     *          
     * $http(url, method, data, callback)
     * @param {String} url     
     * @param {String} method     
     * @param {Obejct} data     ,       
     * @param {Object} headers      ,         
     * @param {Function} callback       
     */
    const $http = (url,method,data,headers,callback)=>{
      const URL =  url;
      if(!url || !method || !data || !callback){
        throw new Error(' ==========              ========== ');
        return false;
      }
      let _http = superagent;
      log.info('      :' + url);
      log.info('      :' + JSON.stringify(data));
      switch (method) {
        case 'get':
          _http = _http.get(url).query(data);
          break;
        
        case 'put':
          _http = _http.put(url).send(data);
          break;
    
        case 'delete':
          _http = _http.del(url).send(data);
          break;
        
        default:
          _http = _http.post(url).send(data);
          break;
      }
      _http.end((err,res)=>{
        callback(null, res);
      })
    }
    module.exports = $http;
    
    中間部品のロード:
    9.app.jsを再改造し、app.useをスクリーンセーバー、ap.use(interceptor)を使用させる.
  • は、スクリーンセーバから返されたデータを処理する-->>
    app.use(interceptor);
    app.use((req,res,next)=>{
    
    }
    
  • たとえば:
    app.use(interceptor);
    app.use((req,res,next)=>{
      let code = res.result['code'];
    
      /*      */
      res.setHeader('Cache-Control', 'no-store');
      switch(code){
        case 403:
          res.send({
            code:403,
            msg:'   token',
          });
          default:
            res.send(res.result['data']);
        break;
      }
      let t = new Date() - req.time,
          conntectStr = req.method + ' ' + req.url + ' ' + t + ' ms';
      log4js.info(conntectStr);
      next();
    });
    
    環境変数の設定:
    11.環境変数の設定:ルートディレクトリのpackage.json種類にコマンドラインを設定する運転コマンドで、異なるスクリプトを実行します.
    urlアドレスを読み込むファイルを作成します.
    pm 2の運転環境変数は、pm 2ファイルを新規作成し、読み込みプロファイルを設定します.
    中のウォッチはpm 2モニターのファイルです.fileはログログに出力されます.instancesは、実行スレッドの数です.
    プロジェクトの開始:
  • はサーバに置いてもいいです.ポートがnodejsの3000であると思わないなら、nginxでドメイン名をマッピングしてもいいです.
  • 中間部品のパラメーターチェックはまだ完全に行われています.合理的ではありません.
    転載先:https://juejin.im/post/5c9ae020e51d454901304b63