高速路由器中的 OOP 继承



我正在用Node/Express编写后端,我正在寻找一种使用Express控制器创建一些OOP继承的方法。

我的结构如下所示:

.
└── 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...
};

我希望putProjectpostProject扩展一个包含此逻辑的基本分支:

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

如果有人对如何写这个有想法,我将不胜感激!

使用 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);

您也可以将该项目解析通用性移动到其自己的函数中,并让路由调用该函数。

相关内容

  • 没有找到相关文章

最新更新