はじめに
こんにちは、カブロビテス! 今日は主に小さな変更がありますが、多くの変更があります。 このパートでは:
- 独自のロガーを作成する
- ログクエリとその処理時間
- 最初の部分で犯した間違いを修正します。
- 承認に対処する
- いくつかのクラスに対処する
- 構成!
ログ
ログについては、その場しのぎのモジュールを使用します。 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を置き換え、キャッシュを追加します。