【发布时间】:2019-09-26 05:43:29
【问题描述】:
我是一名初级 NodeJS 开发人员,目前在加密货币交易平台上工作。这是项目文件夹结构。
/app
/controllers
/user
/order
/settings
...
index.js
/middlewares
/models
/routes
user.js
order.js
/services
user.js
order.js
...
/views
index.js
/config
/migrations
/public
/utils
server.js
.env
...
现在,一开始有点不知所措,但后来,我在应用程序中移动变得很舒服。
除了一个特定的文件!
控制器目录中的 index.js,
这是它的设置方式。
const { readdirSync, lstatSync } = require('fs');
const { validationSchema } = require('../../utils/validator');
module.exports = readdirSync('app/controllers')
.filter(name => lstatSync(`app/controllers/${name}`).isDirectory())
.reduce((controllersAccumulator, dir) => Object.assign(
controllersAccumulator,
{
[`${dir}Controller`]: readdirSync(`app/controllers/${dir}`)
.map(fileName => require(`./${dir}/${fileName}`))
.reduce((accum, controllerFile) => Object.assign(
accum,
Object.keys(controllerFile).reduce(validationSchema.bind(null, dir, controllerFile), {}),
), {}),
},
), {});
我不得不承认,这对我来说一直很害怕,只是看看而已! 所以简单来说就是,它将路由请求映射到控制器目录中的处理程序。
例如,如果一个用户想发出一个帖子请求注册一个新帐户:路由路径将是这样的:
// in the routes dir, user.js
const { userCOntroller } = require('../controllers/');
router.post('/registration', userController.registration);
// in the /controllers, then /user, there will be a registration.js that includes:
const UserService = require('../../services/user');
exports.registration = async (req, res) => await UserService.create(req.body);
//then in the /services directory, user.js
...
class UserService {
static create(body) { ... }
...
}
module.exports = UserService
所以我仍然无法理解的是,我们是如何在最后一个 sn-p 的用户路由中导入 userController 的?这就是/controllers 中的 index.js 文件所产生的内容!
当我问团队中的高级人员时,他们说,是的,它很难阅读,但它的代码更少。
好吧,好吧:\
那么,为了使这个文件更具可读性,可以做些什么不同的事情, 换句话说,有没有办法重构它? 提前致谢!
【问题讨论】:
-
第一个代码 sn-p 确实很难阅读,因为没有任何 cmets
-
为了部分回答您的问题,
userController来自[${dir}Controller],因为${dir}被替换为“用户”、“订单”、“设置”等目录名称,因此生成的模块属性称为userController、orderController等。最后一个代码 sn-p 使用解构来提取其中一个属性,在本例中为userController。这就是名字的由来。实际控制器通过以下语句导入:require(./${dir}/${fileName})。然后通过validationSchema函数过滤(减少)所需的文件。 -
是的,我明白你的意思了,非常感谢,但是如果我想导入实际控制器并直接在用户路由文件中使用它,例如,而不是导入
userControllers然后调用userController.registeration我想直接在用户路由文件中导入registration函数,在这种情况下我应该在哪里传递req.body?再次感谢, -
另外,据我所知,
userController.registration只是一个文件,我的意思是它不是函数调用,那是怎么回事?我的意思是这个 req.body 在特定情况下是如何传递的?? -
我假设文件
registration.js导出一个包含注册函数并位于user目录中的对象。如果是这种情况,那么validationSchema应该返回它的第二个参数 (controllerFile)。这就是registration函数可以出现在userController对象中的方式。为了直接使用这个函数,而不是解构整个用户控制器,你可以这样做:const { userController: {registration} } = require('../controllers/');。然后就可以直接调用registration函数了。
标签: javascript node.js oop model-view-controller controller