Избегайте повторяющихся функций в файле контроллера внутри экспресс-REST API - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть куча функций контроллера, которые делают одно и то же: вызывают сервисную функцию в другом файле с тем же именем.Для примера я приведу только две функции, но представьте, что их несколько.

const express = require('express');
const router = express.Router();
const userService = require('./user.service');
const authorize = require('_helpers/authorize');

// routes
router.post('/authenticate', authenticate);     
router.post('/create', create);
// ...
// ( it goes on like this )
// ...
module.exports = router;



function authenticate(req, res, next) {
    userService.authenticate(req.body)
        .then(user => user ? res.json(user) : res.status(400).json({ message: 'Error.' }))
        .catch(err => next(err));
}

function create(req, res, next) {
    userService.create(req.body)
        .then(user => user ? res.json(user) : res.status(400).json({ message: 'Error.' }))
        .catch(err => next(err));
}
// ...
// ( it goes on like this )

Есть ли способ в Javascript, чтобы избежать такого повторяющегося кода?(Я не новичок в программировании, но я новичок в Javascript).Я думал об автоматизации этой генерации кода с помощью макросов vim, но, возможно, в языке есть какой-то пакет или функция, которая может сделать этот код менее детальным, возможно, какое-то метапрограммирование.

1 Ответ

0 голосов
/ 27 февраля 2019

Создайте две служебные функции, например:

  • handleUser, которая принимает объект res и возвращает другую функцию, которая принимает user.Это позволит вам легко вводить res
  • handleError, который принимает next обратный вызов, и возвращать другую функцию, которая принимает err

const handleUser = res => user =>
  user ? res.json(user) : res.status(400).json({ message: 'Error.' });

const handleError = next => err => next(err);

const authenticate = (req, res, next) =>
  userService.authenticate(req.body)
  .then(handleUser(res)).catch(handleError(next));

const create = (req, res, next) => userService.create(req.body)
  .then(handleUser(res)).catch(handleError(next));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...