Наследование ООП в Экспресс-роутере - PullRequest
0 голосов
/ 14 сентября 2018

Я пишу свой бэкэнд в Node / Express и ищу способ создания наследования ООП с помощью моих контроллеров Express.

Моя структура выглядит так:

.
└── server
    ├── App.js
    ├── controllers
    │   ├── articles.js
    │   └── project.js
    ├── models
    │   ├── articles.js
    │   ├── projects.js
    ├── routes
    │   ├── articles.js
    │   ├── projects.js
    └── views
        ├── error.ejs
        ├── index.ejs
        └── layout.ejs

Есть некоторые задачи, общие для некоторых контроллеров, которые не могут быть выполнены промежуточным программным обеспечением.Для этого я хочу создать базовый класс controller с некоторыми функциями, которые будут использоваться всеми экземплярами контроллера.

Представьте, что у меня есть следующие маршруты:

// routes/project.js

router.put('/:id', upload.any(), putProject);    
router.post('/:id', upload.any(), postProject);

И контроллеры:

// controllers/project.js

export const putProject = function(req, res, next) {
    var data = JSON.parse(req.body.data);
    // Retrieving files appended by Multer to req.files
    req.files.forEach((item) => {
        data[item.fieldname] = '/' + item.path;
    });

    models.Projects.update(data, {
        include: [{ model: models.ProjectImages }],
        returning: true,
        plain: true,
        where: {
            id: req.params.id,
        },
    });
    // etc...
};

export const postProject = function(req, res, next) {
    // Retrieving files appended by Multer to req.files
    var data = JSON.parse(req.body.data);
    req.files.forEach((item) => {
        data[item.fieldname] = '/' + item.path;
    });
    models.Projects.create({
        title: req.body.title,
        description: req.body.description,
        ArticleId: req.body.ArticleId,
    })
    // etc...
};

Я бы хотел, чтобы и putProject, и postProject расширили базовое предложение, содержащее эту логику:

var data = JSON.parse(req.body.data);
req.files.forEach((item) => {
    data[item.fieldname] = '/' + item.path;
});

Если у кого-то есть представление о том, как это можно написатьБуду благодарен!

1 Ответ

0 голосов
/ 14 сентября 2018

Идиоматический способ сделать это с помощью Express - это использовать промежуточное ПО для общих битов и повторно использовать это промежуточное ПО в ваших маршрутах. Например, это промежуточное программное обеспечение может позаботиться о разборе данных проекта:

function parseProject(req, res, next) {
  res.locals.project = JSON.parse(req.body.data);
  req.files.forEach((item) => {
    res.locals.project[item.fieldname] = '/' + item.path;
  })
  next();
}

... позволяя каждому обработчику маршрута получить доступ к res.locals.project, чтобы получить этот проанализированный контент, а не повторять код.

Затем вы можете использовать Маршрутизатор , чтобы упростить настройку общих промежуточных программ:

const projectRouter = express.Router();
projectRouter
  .use(upload.any())
  .use(parseProject)
  .put('/:id', putProject)
  .post('/:id', postProject);

app.use('/projects', projectRouter);

Вы также можете просто перенести общий анализ этого проекта в его собственную функцию и заставить маршруты вызывать функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...