Итак, я наткнулся на этот репозиторий, и на первый взгляд его зависимости выглядят точно так же, как мои. Я пытался найти хороший пример экспресс-репозитория, и это лучший (пока что), который я нашел.

Прежде всего, я создал еще одну ветку для рефакторинга своего кода, и теперь это имеет гораздо больше смысла. Я также преобразовал 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 в свое приложение и реализовывать промежуточное ПО для своих маршрутов.

Если вы читаете это, спасибо, что дошли до конца моего блога! Увидимся со всеми в следующих постах!