Итак, я наткнулся на этот репозиторий, и на первый взгляд его зависимости выглядят точно так же, как мои. Я пытался найти хороший пример экспресс-репозитория, и это лучший (пока что), который я нашел.
Прежде всего, я создал еще одну ветку для рефакторинга своего кода, и теперь это имеет гораздо больше смысла. Я также преобразовал server.js в app.js в качестве точки входа в приложение. Я понял, что это самый распространенный подход, и поэтому я следовал ему.
Я также многое узнал о том, как работает экспорт модулей. Например, после добавления стратегии паспорта нет необходимости использовать тот же объект паспорта для включения в другие модули. Вы можете просто позвонить и потребовать паспорт, и стратегия останется неизменной.
Вот мой конфиг/passport.js
var jwt = require('jsonwebtoken'); var passport = require("passport"); var passportJWT = require("passport-jwt"); var mongoose = require('mongoose'); var Users = mongoose.model('Users'); var ExtractJwt = passportJWT.ExtractJwt; var JwtStrategy = passportJWT.Strategy; const jwtOptions = { jwtFromRequest : ExtractJwt.fromAuthHeaderWithScheme('bearer'), secretOrKey : process.env.SECRET_OR_KEY }; const strategy = new JwtStrategy(jwtOptions, function(jwtPayload, next) { console.log('payload received', jwtPayload); Users.findById(jwtPayload.id, function(err, doc) { if (err) { res.send(err); } if (doc) { next(null, doc); } else { next(null, false); } }); }); passport.use(strategy);
И мои пользовательские маршруты
const passport = require('passport'); const router = require('express').Router(); const users = require('../../controllers/users'); const profile = require('../../controllers/profile'); router.get('/users', users.all); router.post('/users', users.register); router.get('/users/activate', users.activate); router.post('/users/resend/code', users.resendCode); // This route has to go first router.post('/users/login', users.login); router.get('/secret', passport.authenticate('jwt', { session: false }), function(req, res){ res.json("Success you can see me"); }); router.get('/users/:id', users.single); router.post('/users/:id', users.update); router.delete('/users/:id', users.delete); router.get('/profile', passport.authenticate('jwt', { session: false }), profile.get); router.post('/profile', passport.authenticate('jwt', { session: false }), profile.update); module.exports = router;
Это не тот же самый объект, но он отлично сохранил стратегию. Я не знал, что это так работает раньше.
Сегодня я весь день занимался рефакторингом и убедился, что мой код работает.
Я также нашел это руководство по проекту, которое выглядит довольно правдоподобно, но я пока не могу уложить его в голове, особенно в части Структурирование, поэтому я собираюсь остановиться на Стиль MVC на данный момент.
Меня также беспокоило управление версиями API, поэтому я провел небольшое исследование. Похоже, я могу реализовать собственное управление версиями API без помощи других модулей node_modules. Я еще не оценил, стоит ли пытаться, поэтому пока отказался от управления версиями API в качестве приоритета. Но на всякий случай я сталкивался с фреймворком Restify и управлением версиями экспресс-маршрутов (версия передается через заголовки), так что это некоторые допустимые варианты.
Это все на данный момент
Рефакторинг — это так утомительно! Но это будет выгодно в долгосрочной перспективе. В следующий раз я начну внедрять стандарты JWT в свое приложение и реализовывать промежуточное ПО для своих маршрутов.
Если вы читаете это, спасибо, что дошли до конца моего блога! Увидимся со всеми в следующих постах!