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



必要なすべてのvar



const



let



置き換えます。 少し変更されますが、私はそれが好きです!







ログイン



さあ、認可に! 承認のために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を置き換え、キャッシュを追加します。








All Articles