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

はじめに


こんにちは、カブロビテス! 今日は主に小さな変更がありますが、多くの変更があります。 このパートでは:



ログ


ログについては、その場しのぎのモジュールを使用します。 loggerフォルダーを作成します。 index.jsファイルがindex.jsます。


 var stackTrace = require('stack-trace'); //      var util = require('util'); //util.inspect() var path = require('path'); //path.relative() path.sep var projectname = require('../package').name; //package.json -> project name module.exports = class Logger //   :) { constructor() { function generateLogFunction(level) //     :) { return function(message,meta) { //var d = Date.now(); //      var mes = this.module + " -- "; mes += level + " -- "; mes += message; //   if(meta) mes += " " + util.inspect(meta) + " "; //    (Object||Error) mes += '\n'; //   :) this.write(mes); //       } }; this.trace = stackTrace.get()[1]; //    this.filename = this.trace.getFileName(); //       this.module = projectname + path.sep + path.relative('.',this.filename); //    this.streams = [process.stdout]; //        //        this.log = generateLogFunction('Log'); //   this.info = generateLogFunction('Info'); //   this.error = generateLogFunction('Error'); //   this.warn = generateLogFunction('Warning'); //   } write(d) { this.streams.forEach((stream)=>{ stream.write(d); }); } } 

そして今、使用の構文について。


 var logger = new require('./logger')(); //... logger.info('Hello, world'); 

なぜnewを使用するのですか? ロガーが作成されたファイルの名前を取得するため。 ログに書き込むたびにスタックトレースを起動するには、多くのリソースを使用します。 すべてのコンソールをロガーに交換します。 私はあなたのIDEの意志にすべてを任せます:)


注: docおよびnode_modulesフォルダーには、 consoleを使用するファイルがあります。 注意してください!


また、 worker.js console.errorファイルをthrowに置き換えます。 このように:


 app.listen(3000,function(err){ if(err) throw err; //       logger.log(`Running server at port 3000!`) //         //      }); 

ログのwinstonやその他のモジュールを使用しないのはなぜですか? 答えは簡単です。 winstonパフォーマンスはほとんどありません。 そして、ウィンストンだけではありません。 同じことが多くのモジュールに当てはまります。 判明したように、いくつかのテストの後、自家製のモジュールは他の多くのモジュールよりも4〜8倍高いパフォーマンスを示しています:)


リクエスト処理時間


サーバーに送信された要求とその処理にかかった時間を確認するために、ミドルウェアを作成します。 binフォルダーで、 rt.jsファイルを作成します


 var Logger = require('../logger'); var logger = new Logger(); module.exports = function(req,res,next) { //   var beginTime = Date.now(); //    res.on('finish',()=>{ var d = Date.now();//     logger.log('Reponse time: ' + (d - beginTime),{ url:req.url, //       ( urlencode string :) time:(d - beginTime) //    }); }); //     next(); } 

また、 worker.js 、ハンドラーに追加します。


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

ここでは独自のモジュールを使用します。他のすべてのモジュールは、保証された要求のみ(少なくともOSに対して)を記録できないためです。


ルーターとアプリケーションの違い


コントローラーでは、 express()を使用してミニアプリケーションを作成し、 app.use()を使用してプロジェクトにマウントしましたが、エクスプレスを使用することはお勧めしません。 コントローラーファイル内のexpress()new express.Router()に置き換えます。


 // : var Router = require('express').Router; var app = new Router(); // app.use(....) // app.get(....) // etc 

express()でどのような問題が発生しますか? 最も重要なこと。 アプリケーション全体で設定を変更することはできません。 また、 app.localsは使用できません。 また、何らかの不明な理由により、Cookieを送信しません(なぜですか?)。


構成


configフォルダーを作成します。 フォルダーにはindex.jsファイルがあり、すべての設定、追加、解析、さらには 牛を奪う 必要に応じて、必要なフィールドが欠落している場合は挿入します。


 module.exports = require('./config'); 

そしてconfig.jsonファイルで:


 { "port":8080, "mongoUri":"mongodb://127.0.0.1/armleo-test" } 

注:Windowsに有効なネットワークがない場合、 localhostは機能せず、 127.0.0.1を使用する必要があります
worker.jsファイルで、先頭worker.js追加します。


 var config = require('../config'); 

そして最後の行は うさぎ 以下:


 //     3000      . //  Worker-        app.listen(config.port,function(err){ if(err) throw err; //       logger.log(`Running server at port ${config.port}!`); //         //      }); 

dbinit.jsの行を変更する必要があることを覚えていますか? やってみましょう。


 // 10 line bin/dbinit.js //    MongoDB var config = require('../config'); mongoose.connect(config.mongoUri,{ server:{ poolSize: 10 //      // 10     . //      ... } }); 

ES6


必要なすべてのvarconstlet置き換えます。 少し変更されますが、私はそれが好きです!


ログイン


さあ、認可に! 承認のためにPassport.jsを使用します。 このプロジェクトでは、登録は必要ありませんが、ユーザーは1人だけなので、データベースに手動で追加します。 auth.jsコントローラーを作成します。 コントローラーでは、入力パーサーが必要です。


 let app = new (require('express').Router)(); const models = require('./../models'); const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; app.use(passport.initialize()); app.use(passport.session()); passport.use(new LocalStrategy( function(username, password, done) { models.User.findOne({ username: username }, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (user.password != password) { return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } )); passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(id, done) { models.User.findById(id, function(err, user) { done(err, user); }); }); app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }) ); app.get('/login',function(req,res,next) { if(req.user) return res.redirect('/'); res.render('login',{ user:req.user }); }); module.exports = app; 

views/login.htmlために、 views/login.htmlフォームviews/login.html追加しviews/login.html


 <form action="/login" method="POST"> <input name="username"/> <br/> <input name="password"/> <br/> <input type="submit"/> </form> 

ユーザー向けに、モデルを作成します。


投稿!


モジュールをインストールします。


 npm i mongoose-url-slugs --save 

post.jsファイルのmodelsフォルダーに投稿モデルを作成します。


 //  mongoose ..          const mongoose = require('mongoose'); const URLSlugs = require('mongoose-url-slugs'); //   ! let postSchema = new mongoose.Schema({ title:{ type:String, // : String required:[true,"titleRequired"], //   .        titleRequired //   32   (Unicode symbol != byte) minlength:[6,"tooShort"], unique:true //     }, text:{ type:String, //  String required:[true,"textRequired"] //      }, //     ,       ! //   //  //   // slug:String }); //    ( ) //      postSchema.plugin(URLSlugs('title')); //     module.exports = mongoose.model('Post',postSchema); 

そして、 models/index.js


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

投稿を作成/編集するためのコントローラーを作成します! ファイルcontrollers/index.js


 const Logger = require('../logger'); const logger = new Logger(); let app = new (require('express').Router)(); app.use(require('./auth')); app.use(require('./home')); app.use(require('./post')); module.exports = app; 

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


 let app = new (require('express').Router)(); const models = require("../models"); app.get('/post', function(req,res,next) { if(!req.user) return res.redirect('/login'); res.render('addpost',{ user:req.user }); }); app.post('/post', function(req, res, next) { if(!req.user) return res.redirect('/login'); let post = new models.Post(req.body); post.save() .then(()=>{ res.redirect('/post/' + post.slug); }).catch(next); }); app.get('/post/:slug',(req, res, next)=>{ models.Post.findOne({ slug:req.params.slug }).exec().then((post)=>{ if(!post) res.redirect('/#notfound'); res.render('post',{ user:req.user, post }); }).catch(next); }); module.exports = app; 

そしてそれに応じて画像! クリエーションviews/addpost.html


 <form method="POST" action="/post"> <input name="title"/> <br/> <input name="text"/> <br/> <input type="submit"/> </form> 

views/post.html


 {{#post}} <h1>{{title}}</h1> <br/> {{text}} {{/post}} 

views/index.html画像を仕上げましょう


 {{#user}} Hello {{username}} {{/user}} {{^user}} Login <a href="/login">here!</a> {{/user}} {{#posts}} <br/><a href="/post/{{slug}}">{{title}}</a> {{/posts}} 

コントローラーcontrollers/home.js完成させましょう:


 let app = new (require('express').Router)(); const models = require('../models'); app.get('/',(req,res,next)=>{ //  handler     `/` models.Post.find({}).exec().then((posts)=>{ res.render('index',{ user:req.user, posts }); //      index }).catch(next); }); module.exports = app; 

bin/worker.jsにurlencodeパーサーを追加します。


 app.use(bodyParser.urlencoded()); 

Github


こちらのgithub プロジェクトを見つけることができます


第二部の終わり!


これで第2部の終わりです。 次へ 一部では、HTTPS、Ubuntuのサービスに時間を割り当てます。パスワード、Kaptcha(recaptcha)、コメントをいくつかの統計でハッシュし、投稿のマークダウンサポートを導入します。Redis上のセッションのMongoDBを置き換え、キャッシュを追加します。



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


All Articles