Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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 如何使用express要求多个控制器?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 如何使用express要求多个控制器?

Javascript 如何使用express要求多个控制器?,javascript,node.js,express,Javascript,Node.js,Express,所以我试着做一个完整的堆栈项目。它有注册、登录、配置文件等控制器 我所做的是手动要求每个控制器,然后根据请求使用它们。例如,我将 app.use('/signup',signup); app.use('/login',login); app.use('/profile',profile); 然而,当我构建项目的复杂性时,将需要更多的控制器,但是手动键入所有内容并不是最佳做法 我想有一个更一般的形式,只有一行完成所有工作: app.use('whatever the link i got',lo

所以我试着做一个完整的堆栈项目。它有注册、登录、配置文件等控制器

我所做的是手动要求每个控制器,然后根据请求使用它们。例如,我将

app.use('/signup',signup);
app.use('/login',login);
app.use('/profile',profile);
然而,当我构建项目的复杂性时,将需要更多的控制器,但是手动键入所有内容并不是最佳做法

我想有一个更一般的形式,只有一行完成所有工作:

app.use('whatever the link i got',load the corresponding controller);

也许解决方案会有不同的形式。我怎样才能做到这一点?我需要一些建议。

最简单的解决方案可能是将它们全部放在
控制器
目录中,然后执行以下操作:

const controllers = readdirSync(path.join(__dirname, 'controllers'))
controllers.forEach(controller => {
  app.use(`/${controller}`, require(`./controllers/${controller}`))
})
只要路由和控制器的名称相同,这种方法就非常有效。如果你需要处理如何将烤肉串转化为骆驼肉盒的问题,总有一些方法

假设您使用的是express 4,您可以更进一步,在controllers目录中放置一个
index.js
。内部:

const express = require('express')
const router = express.Router()

const controllers = readdirSync(__dirname))
  .filter(f => f !== 'index.js'))
controllers.forEach(controller => {
  router.use(`/${controller}`, require(`./${controller}`))
})

module.exports = router
然后您可以像这样使用路由器:

app.use('/', require('./controllers'))

我认为应该是f=>f.endsWith('.js'),而不是!,另外,当我使用这段代码时,它说Router.use()需要中间件函数,但得到了一个对象。需要help@jianchengwu抱歉,从一个项目中复制了它,该项目的每个路由都位于它自己的目录中。我修正了上面的答案;试试看。另外,确保控制器目录中除了控制器和index.js文件之外没有其他内容。