Mongoose、Express、Clusterを使用してNode.jsでプロジェクトを作成しています。 パート1

はじめに



こんにちは、ユーザー名%! 今日は、 clusterExpress.js 、およびmongooseを使用して、Node.jsでMVCのようなフレームワークアプリケーションを作成する方法について説明します。







タスクは、いくつかの機能を備えたサーバーを上げることです。









この記事は初心者向けの初心者向けです。 コメントがあれば嬉しいです!







どこから始めますか? Node.js(npmに付属)をインストールします。 MongoDBをインストールします(+ PATHに追加)。







すべての依存関係をgitにドラッグしないために、NPMプロジェクトを作成します!







$ npm init
      
      





いくつかの質問に答える必要があります(Enterキーを押すだけですべてをスキップできます)。 npmのバグとpackage.jsonの作成が​​完了しない場合があります。







もっと! index.js



書きましょう







 // Project/bin/index.js process.stdout.isTTY = true; //   node.js    git bash  ! //  https://github.com/nodejs/node/issues/3006 var cluster = require('cluster'); //   if(cluster.isMaster) { //   <<master>>       require('./master'); } else { //   <<worker>>      worker-a require('./worker'); }
      
      





クラスターについて少し。







クラスターとは何ですか? クラスターは、メインロール(マスター)と作業ロール(ワーカー)の2つのロールがあるアプリケーションシステムです。 すべての要求がCPUCount



されるマスターが1つあり、n番目のワーカー( CPUCount



コード内)があります。







サーバーにリクエストが届くと、ウィザードはこのリクエストを送信するワーカーを決定します。 作業ノードを作成すると、現在実行中の同じコードを実行してIPCを作成するプロセスが生成されます。 TCP / IP接続が発生すると、ウィザードは、IPCを介して特定のポリシー(詳細はこちら )に従ってSocket



いずれかのワーカーに提供します。







コードに戻ります。 マスターとワーカーはどうなりましたか? ウィザードコード:







 //Project/bin/master.js var cluster = require('cluster'); //    cluster var CPUCount = require("os").cpus().length; //     //      .     8    Nodemon-     . //      CPUCount  1      .... cluster.on('disconnect', (worker, code, signal) => { //    IPC    (     ) console.log(`Worker ${worker.id} died`); //     ,     . cluster.fork(); //   }); cluster.on('online', (worker) => { //        ! console.log(`Worker ${worker.id} running`); }); //     CPUCount for(var i = 0; i < CPUCount; ++i) { cluster.fork(); //  ! :) }
      
      





矢印機能オンライン切断パターンラインについて







次は? 次の仕事! ここでは、1つのコードを記述します。 その後、スキップして追加すると言います:)しかし、その前に、npmから依存関係をダウンロードしてください!







 $ npm i express apidoc bluebird body-parser busboy connect-mongo cookie-parser express-session image-type mongoose mongoose-unique-validator nodemon passport passport-local request request-promise --save
      
      





なぜ各モジュールが必要なのですか?









それで? nodemonを実行するスクリプトを作成します。 package.jsonに追加します(そのようなフィールドがある場合は置き換えます)







 "scripts":{ "start":"nodemon bin/index.js" }
      
      





開始するには、次を使用します







 $ npm start
      
      





将来、テスト、ドキュメントを追加します。







ワーカーに戻りましょう。 まず、Expressを起動しましょう!







 var express = require('express'); //  express var app = express(); //    app.get('/',(req,res,next)=>{ //  handler     `/` res.send('Hello, World!'); //   ! }); //     3000      . //  Worker-        app.listen(3000,function(err){ if(err) console.error(err); //       //   ..   handler- else console.log(`Running server at port 3000!`) //         //      });
      
      





それだけですか? いや 実際、Expressのセットアップについて忘れていたことがいくつかあります。 修正してください。 結局のところ、フロントパートにファイルが必要ですか? (フロントエンド)。 サポートを追加してください! /public



すべてのコンテンツを含むpublic



フォルダーを作成します。 2つのオプションがあります。 NGINXを配置し、配置しないでください。 最も簡単なオプションは、配置しないことです。 Expressに組み込まれているものを使用します。







別のオプションは、NGINXをウィザードとして使用することです。これは、静的ファイルの役割も担います。 これをしばらくの間放置しますが、これはパフォーマンスとスケーリングに役立ちます。







app.get('/')



前。 以下を追加します。







 //.... var path = require('path'); // app = express();    //   //    project/public      /public app.use('/public',express.static(path.join(__dirname,'../public'))); //...
      
      





それだけですか? もう一度! さて、入力に。 どのように入力を受け取りますか?







 var bodyParser = require('body-parser'); //.. /// app.use(express.static(.........)); // JSON  :) app.use(bodyParser.json({ limit:"10kb" })); //...
      
      





クッキーに







 // JSON  // ... //  ! app.use(require('cookie-parser')()); // ...
      
      





しかし、それだけではありません! 次に、セッションで作業するため、 Mongoose



機能させる必要があります! 次のコマンドでMongoDBを実行します







 $ mkdir database $ mongod --dbpath database --smallfiles
      
      





ここで何が起こっていますか? サーバーデータが保存されるデータベースフォルダーを作成します。 フォルダーを.gitignore



に追加することを忘れないでください。 次に、ストレージとしてdatabase



フォルダーを指すMongoDBを起動しdatabase



。 ファイルが小さいように、 --smallfiles



パラメーターを渡しますが、この場合でもMongoDBは./database/journalフォルダーに200MBのログを保存します







また、第2部では、MongoDBの帯域幅を増やす方法に関するチュートリアルがあり、Ubuntuのsystemd



でサービスとしてインストールします。







次にコードに移ります。 worker.jsファイルで、モジュールがロードされた直後のファイルの先頭に、次を挿入します







 require('./dbinit'); //  
      
      





bin



フォルダーにdbinit.js



ファイルを作成します。 次のコードを挿入します:







 //  ! //  mongoose var mongoose = require('mongoose'); //    (Promise)      mongoose (mpromise) mongoose.Promise = require('bluebird'); //  Bluebird //    MongoDB //         mongoose.connect("mongodb://127.0.0.1/armleo-test",{ server:{ poolSize: 10 //      // 10     . //      ... } }); //        mongoose.connection.on('error',(err)=> { console.error("Database Connection Error: " + err); //     MongoDB  :) console.error('  MongoDB !'); process.exit(2); }); //         mongoose.connection.on('connected',()=> { //   console.info("Succesfully connected to MongoDB Database"); //       . });
      
      





次に、セッションをデータベースにバインドします。 bin/worker.js



に以下を追加します。 モジュールをロードすることから始めます。







 var session = require('express-session'); //  var MongoStore = require('connect-mongo')(session); //    
      
      





Cookieパーサーの後:







 //   //     app.use(session({ secret: ' ', //     resave: false, //      saveUninitialized: true, //    store: new MongoStore({ mongooseConnection: require('mongoose').connection }) //    }));
      
      





接続のシーケンスに関するいくつかの説明。 express.static('/public')



。 初めに座っているのは ブラウザはファイルのリクエストを並行して送信し、空のセッションでリクエストを送信し、数千のリクエストを作成します。







Cookiesパーサーとセッションは最初に必要です 将来的には承認に使用します。 その後、リクエスト本文のパーサーがあります。 注:最後の2つは交換できます。 認可サービス。 パーサーとセッションの後に行く必要があります それらを使用しますが、コントローラの前に ユーザー情報を使用します。 次はコントローラーです。少し後でそれらに戻ります。







エラーハンドラになりました。 彼は最後に行くべきだ Expressではそう書かれています:)







bin/worker.js



app.listen(.....);



bin/worker.js



追加しbin/worker.js



app.listen(.....);



次の







 //   app.use(require('./errorHandler'));
      
      





次に、 errorHandler.js



ファイルを作成します







 //      4 ,      module.exports = function(err,req,res,next) { // err    Express.js       ,       ; console.error(err); //        ,      . res.status(503).send(err.stack || err.message); //    next()      . //      503   };
      
      





Workerでの作業はほぼ終了しました。 ただし、モデルとそのロードを構成する必要があります。

models



保存するmodels



フォルダーを作成します。 将来的には、データベースのあるバージョンから新しいバージョンに移行することにより、さらに多くの移行を行う予定です。







models



フォルダーにindex.js



およびuser.js



ファイルを作成します。 したがって、 index.js



すべてのモデルのロードとエクスポートをuser.js



ますuser.js



ファイルには、Mongooseのモデルと、モデルに関連付けられたいくつかのメソッドと関数が含まれます。 Mongoose Webサイトまたはドキュメントでモデルについて読むことができます

index.js



ように記述します。







 module.exports = { //    () //  *nix-      User:require('./User') }; //     !
      
      





そして、 user.js



ように記述します。







 //  mongoose ..          var mongoose = require('mongoose'); //   ! var userSchema = new mongoose.Schema({ //  username:{ type:String, // : String required:[true,"usernameRequired"], //   .        usernameRequired maxlength:[32,"tooLong"], //   32   (Unicode symbol != byte) minlength:[6,"tooShort"], //   ! match:[/^[a-z0-9]+$/,"usernameIncorrect"], //   !   ! unique:true //     }, //  password:{ type:String, //  String //       maxlength:[32,"tooLong"], minlength:[8, "tooShort"], match:[/^[A-Za-z0-9]+$/,"passwordIncorrect"], required:[true,"passwordRequired"] //      }, //     ,       ! }); //    ( ) //     module.exports = mongoose.model('User',userSchema);
      
      





次に、画像( view



変換を試みる)とコントローラーを扱います。 controllers



views



2つのフォルダーを作成しviews



。 次に、イメージをレンダリング(描画、描画、コンパイル、塗りつぶし)する必要があるライブラリを選択します。 口ひげは私にとって非常に簡単であることが判明しました。 ただし、レンダリングエンジンを簡単に変更できるようにするために、consolidateを使用します。







 $ npm i consolidate mustache --save
      
      





Consolidateでは、プロジェクトで使用されるエンジンをインストールする必要があるため、インストールするエンジンを変更することを忘れないでください。 次に、 app.get('/');



全体を挿入して置き換えapp.get('/');









 var cons = require('consolidate'); //    app.engine('html', cons.mustache); //    app.set('view engine', 'html'); //    app.set('views', __dirname + '/../views'); app.get('/',(req,res,next)=>{ //  handler     `/` res.render('index',{title:"Hello, world!"}); //      index });
      
      





次に、 views



フォルダーで、index.htmlを追加します







 {{title}}
      
      





127.0.0.1:3000



移動してHello, World!



。 コントローラーに移りましょう! 行app.get(.................)



削除します。 次に、コントローラーをダウンロードする必要があります。 ( controllers



フォルダにあります)。 リモートコードの代わりに、次を挿入します。







 app.use(require('./../controllers')); //  !
      
      





ファイルcontrollers/index.js



書き込みます







 var app = require('express')(); app.use(require('./home')); module.exports = app;
      
      





そして、ファイルcontrollers/home.js



書いてください:







 var app = require('express')(); app.get('/',(req,res,next)=>{ //  handler     `/` res.render('index',{title:"Hello, world!"}); //      index }); module.exports = app;
      
      





これで最初のパートは終わりです! ご清聴ありがとうございました。 私たちの注意なしに多くが残ったので、第2部でこれを修正する必要があります。 多くの物議を醸す問題があります。 2番目の部分で修正される多くのエラーもあります。 コードは、少し後でgithubに投稿されます。 プロジェクトの本質については、第2部で説明します。








All Articles