Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJs MVC架构,这是通心粉代码吗?_Javascript_Node.js_Oop_Model View Controller_Controller - Fatal编程技术网

Javascript NodeJs MVC架构,这是通心粉代码吗?

Javascript NodeJs MVC架构,这是通心粉代码吗?,javascript,node.js,oop,model-view-controller,controller,Javascript,Node.js,Oop,Model View Controller,Controller,我是一名初级NodeJS开发人员,目前正在一个加密货币交换平台上工作。下面是项目文件夹结构 /app /控制器 /使用者 /命令 /背景 ... index.js /中间商 /模型 /路线 user.js order.js /服务 user.js order.js ... /观点 index.js /配置 /迁移 /公开的 /乌提尔斯 server.js 环境署署长 …解释第一个代码段的最简单方法是重写它并添加适当的注释: //获取控制器目录中的所有文件名 const fileList=rea

我是一名初级NodeJS开发人员,目前正在一个加密货币交换平台上工作。下面是项目文件夹结构

/app
/控制器
/使用者
/命令
/背景
...
index.js
/中间商
/模型
/路线
user.js
order.js
/服务
user.js
order.js
...
/观点
index.js
/配置
/迁移
/公开的
/乌提尔斯
server.js
环境署署长

解释第一个代码段的最简单方法是重写它并添加适当的注释:

//获取控制器目录中的所有文件名
const fileList=readdirSync('app/controllers');
//仅从文件列表中获取目录
const onlyDirectories=fileList.filter(name=>lstatSync(`app/controllers/${name}`).isDirectory();
//创建将从此模块导出的空对象。此对象的属性将在“for of”循环中指定
const objectToExport={};
//从给定目录导入所有文件并将其分配给objectToExport
for(仅允许目录的目录名){
//首先获取所有文件名
const controllerFiles=readdirSync(`app/controllers/${directoryName}`);
//然后需要这些文件中的每一个
const controllerModules=controllerFiles.map(文件名=>require(`./${directoryName}/${fileName}`));
//将导入的模块分配给`objectToExport`
controllerModules.forEach((controllerModule)=>{
//验证每个模块并仅在其通过验证时分配它
if(validationSchema(目录名、控制器模块)){
objectToExport[`${directoryName}Controller`]=controllerModule;
}
});
}
module.exports=objectToExport;
下面我将从评论中回答您的后续问题。 生成的对象现在如下所示:

{
    userController: {
        registration: [Function],
        ...
    },
    orderController: {
        ...
    },
    ...
}
注册函数最终位于
userController
属性中,因为它是由
registration.js
导出的,然后由我的第一个代码段中的require语句导入的。要在其他文件中直接使用此函数,必须按以下方式对其进行分解:

const { userController: {registration} } = require('../controllers/');
//now you can use it like this:
router.post('/registration', registration);
最后一个问题是关于
req.body
。如您所见,该函数采用两个参数:reqres

exports.registration = async (req, res) => await UserService.create(req.body);

然后将其作为中间件传递给路由器。我假设您正在使用作为您的框架。如果是这样,
req
res
由路由器自动传递到
注册
功能。这就是此函数中的
UserService
如何使用它们。Express会按说明自动创建
body
属性

第一个代码片段确实很难阅读,因为没有任何注释部分回答您的问题,
userController
来自
[${dir}Controller]
,因为
${dir}
被替换为“user”、“order”、“settings”等目录名,因此,生成的模块属性被称为
userController
orderController
等等。最后一个代码段使用解构来提取其中一个属性,在本例中是
userController
。这就是这个名字的由来。实际控制器通过以下语句导入:
require(./${dir}/${fileName})
。然后通过
validationSchema
功能过滤(减少)所需的文件。是的,我明白了你的意思,非常感谢,但是如果我想导入实际控制器并直接在用户路由文件中使用它,例如,相反,如果导入
userControllers
,然后调用
userController.registation
我想直接在用户路由文件中导入
registation
函数,在这种情况下,我应该在哪里传递req.body?再次感谢,,,另外,
userController.registration
就我所知只是一个文件,我的意思是它不是一个函数调用,这是怎么回事??我的意思是,在特定情况下,这个req.body是如何传递的??我假设文件
registration.js
导出一个包含注册函数的对象,该对象驻留在
user
目录中。如果是这种情况,则
validationSchema
应返回其第二个参数(
controllerFile
)。这就是
registration
函数如何出现在
userController
对象中。为了直接使用此函数,而不是分解整个用户控制器,可以执行如下操作:
const{userController:{registration}}=require('../controllers/')。然后您可以直接调用
注册
函数。