Правильно ли так оформлять роутинг?

Пытаюсь научится правильно писать backend сервера на ноде, но вот не очень уверен можно ли оформлять код в таком стиле? Буду рад любым замечаниям.

const router = require('express').Router();
const mongoose = require('mongoose');

// Project model
const Project = require('../models/project');

// @routes
router
  .route('/:id')
  .all((req, res, next) => {
    if (!mongoose.Types.ObjectId.isValid(req.params.id)) {
      next(new Error(404, "Wrong project id"));
    } else {
      next();
    }
  })
  .get((req, res, next) => {
    Project.findById(req.params.id)
      .then(project => res.json(project));
  })
  .put((req, res, next) => {
    Project.findByIdAndUpdate(req.params.id, req.body, { new: true })
      .then(project => res.json(project));
  })
  .delete((req, res, next) => {
    Project.findByIdAndRemove(req.params.id)
      .then(project => res.json(project));
  })
  .post((req, res, next) => {
    next(new Error("not implemented!"));
  });

router.get('/', (req, res, next) => {
  Project.find()
    .sort({ date: -1 })
    .then(projects => res.json(projects))
    .catch(next);
});

router.post('/', (req, res, next) => {
    const newProject = new Project({
      name: req.body.name,
      description: req.body.description,
      slides: []
    });

    newProject
      .save()
      .then(project => res.json(project))
      .catch(next);
  });

module.exports = router;
  • Вопрос задан
  • 346 просмотров
Пригласить эксперта
Ответы на вопрос 2
Anubis
@Anubis
Люблю корейскую кухню и веб-разработку
Я предпочитаю хранить экземпляр express/koa приложения, экземпляр роутера и роуты в разных файлах.
  • router.js
    import Router from 'koa-router';
    
    export const router = new Router();


  • routes/index.js
    import './example';
    import './another-route';
    import './one-more-route';


  • routes/example.js
    import { router } from '../../router';
    
    router.get('/example', (ctx) => {
        ctx.body = { yo: 'Yo dude' };
    });
    
    router.post('/example', (ctx) => {
        ctx.body = { wow: 'Some POST request goes here' };
    });


  • app.js
    import Koa from 'koa';
    
    import { router } from './router';
    import './routes';
    
    const app = new Koa();
    // body parser etc
    // app.use(someMiddleware());
    // app.use(moreMiddleware());
    app.use(router.routes(), router.allowedMethods());
    
    app.listen(8000);


Ответ написан
Комментировать
Лучше вынести код обработки запросов в отдельное место.

api/project.js
const mongoose = require('mongoose');

const api = {};

api.checkId = () => (req, res, next) =>  {
    if (!mongoose.Types.ObjectId.isValid(req.params.id)) {
        next(new Error(404, "Wrong project id"));
    } else {
        next();
    }
};

api.get = (Project) => (req, res, next) => {
    Project.findById(req.params.id)
        .then(project => res.json(project));
};

api.update = (Project) => (req, res, next) => {
    Project.findByIdAndUpdate(req.params.id, req.body, { new: true })
        .then(project => res.json(project));
};

api.delete = (Project) => (req, res, next) => {
    Project.findByIdAndRemove(req.params.id)
        .then(project => res.json(project));
};

api.notImplement = () => (req, res, next) => {
    next(new Error("not implemented!"));
};

api.all = (Project) => (req, res, next) => {
    Project.find()
        .sort({ date: -1 })
        .then(projects => res.json(projects))
        .catch(next);
};

api.create = (Project) => (req, res, next) => {
    const newProject = new Project({
        name: req.body.name,
        description: req.body.description,
        slides: []
    });

    newProject
        .save()
        .then(project => res.json(project))
        .catch(next);
};

module.exports = api;


router/router.js
const router = require('express').Router();
const api = require('../api/project')

// Project model
const Project = require('../models/project');

// @routes
router
    .route('/:id')
    .all(api.checkId())
    .get(api.get(Project))
    .put(api.update(Project))
    .delete(api.delete(Project))
    .post(api.notImplement());

router.get('/', api.all(Project));

router.post('/', api.create(Project));

module.exports = router;


UPD:
Ещё думаю ошибки лучше возвращать серверу, если не планируется потом их как-то обрабатывать:
res.status(404).json({message: 'Project not found'}).end()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы