はじめに
こんにちは、ユーザー名%! 今日は、 cluster 、 Express.js 、およびmongooseを使用して、Node.jsでMVCのようなフレームワークアプリケーションを作成する方法について説明します。
タスクは、いくつかの機能を備えたサーバーを上げることです。
- いくつかの非同期スレッドで動作します。
- セッション情報はすべてのフローで共有されます。
- HTTPSサポート。
- 認可
- 簡単に拡張できます。
この記事は初心者向けの初心者向けです。 コメントがあれば嬉しいです!
どこから始めますか? 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
なぜ各モジュールが必要なのですか?
-
Express
-明らかだと思います。 -
apidoc
-APIのドキュメント化に便利(オプション) -
Bluebird
約束::)。 私たちはそれを必要とします 標準のPromise 4.x.xには、メモリリークがあったためにバグがありました。 また、mongooseが依存するmpromiseはサポートされなくなりました。 MongooseにBluebirdを使用させる必要があります。 -
body-parser
parser-ボディ(ボディ)を持つリクエストでのJSONサポート -
busboy
ボディのリクエストでのフォームデータのサポート。 -
cookie-parser
用のシンプルなモジュール。 -
connect-mongo
セッションをMongoDBに保存するためにconnect-mongo
-
express-session
セッション用。 -
image-type
type-ロード時の画像検証用。 -
mongoose
もちろん、MongoDBに簡単にアクセスできます -
mongoose-unqiue-validator
モデル内のデータが一意でなければならないことを示すため(例:ユーザー名、メールなど) -
nodemon
開発中、ファイルを保存するときにサーバーを自動的に再起動します。 -
passport
passport-local
local-認証に役立つモジュール! -
request
request-promise
コードをテストします!
それで? 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部で説明します。