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変換を試みる)とコントローラーを扱います。 controllersviews 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部で説明します。



Source: https://habr.com/ru/post/J314394/


All Articles