Javascript 避免在express REST API中的控制器文件中重复使用函数

Javascript 避免在express REST API中的控制器文件中重复使用函数,javascript,node.js,rest,express,Javascript,Node.js,Rest,Express,我有一堆控制器函数,它们的作用完全相同:在另一个同名文件中调用服务函数。为了举例说明,我将只提供两个函数,但假设有几个函数 const express = require('express'); const router = express.Router(); const userService = require('./user.service'); const authorize = require('_helpers/authorize'); // routes router.post(

我有一堆控制器函数,它们的作用完全相同:在另一个同名文件中调用服务函数。为了举例说明,我将只提供两个函数,但假设有几个函数

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宏自动生成代码,但可能语言中有一些包或功能可以使代码看起来不那么冗长,可能是某种元编程。

创建两个实用函数,如下所示

  • 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));