はじめに
こんにちは、カブロビテス! 今日は主に小さな変更がありますが、多くの変更があります。 このパートでは:
- 独自のロガーを作成する
- ログクエリとその処理時間
- 最初の部分で犯した間違いを修正します。
- 承認に対処する
- いくつかのクラスに対処する
- 構成!
ログ
ログについては、その場しのぎのモジュールを使用します。 logger
フォルダーを作成します。 index.js
ファイルがindex.js
ます。
var stackTrace = require('stack-trace');
そして今、使用の構文について。
var logger = new require('./logger')();
なぜnew
を使用するのですか? ロガーが作成されたファイルの名前を取得するため。 ログに書き込むたびにスタックトレースを起動するには、多くのリソースを使用します。 すべてのコンソールをロガーに交換します。 私はあなたのIDEの意志にすべてを任せます:)
注: doc
およびnode_modules
フォルダーには、 console
を使用するファイルがあります。 注意してください!
また、 worker.js
console.error
ファイルをthrow
に置き換えます。 このように:
app.listen(3000,function(err){ if(err) throw err;
ログのwinston
やその他のモジュールを使用しないのはなぜですか? 答えは簡単です。 winston
パフォーマンスはほとんどありません。 そして、ウィンストンだけではありません。 同じことが多くのモジュールに当てはまります。 判明したように、いくつかのテストの後、自家製のモジュールは他の多くのモジュールよりも4〜8倍高いパフォーマンスを示しています:)
リクエスト処理時間
サーバーに送信された要求とその処理にかかった時間を確認するために、ミドルウェアを作成します。 bin
フォルダーで、 rt.js
ファイルを作成します
var Logger = require('../logger'); var logger = new Logger(); module.exports = function(req,res,next) {
また、 worker.js
、ハンドラーに追加します。
ここでは独自のモジュールを使用します。他のすべてのモジュールは、保証された要求のみ(少なくともOSに対して)を記録できないためです。
ルーターとアプリケーションの違い
コントローラーでは、 express()
を使用してミニアプリケーションを作成し、 app.use()
を使用してプロジェクトにマウントしましたが、エクスプレスを使用することはお勧めしません。 コントローラーファイル内のexpress()
をnew express.Router()
に置き換えます。
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');
そして最後の行は うさぎ 以下:
dbinit.js
の行を変更する必要があることを覚えていますか? やってみましょう。
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
フォルダーに投稿モデルを作成します。
そして、 models/index.js
:
module.exports = {
投稿を作成/編集するためのコントローラーを作成します! ファイル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)=>{
bin/worker.js
にurlencodeパーサーを追加します。
app.use(bodyParser.urlencoded());
Github
こちらのgithub でプロジェクトを見つけることができます
第二部の終わり!
これで第2部の終わりです。 次へ 一部では、HTTPS、Ubuntuのサービスに時間を割り当てます。パスワード、Kaptcha(recaptcha)、コメントをいくつかの統計でハッシュし、投稿のマークダウンサポートを導入します。Redis上のセッションのMongoDBを置き換え、キャッシュを追加します。