【问题标题】:Router.use() requires a middleware function but got a undefinedRouter.use() 需要一个中间件函数,但有一个未定义的
【发布时间】:2017-12-13 09:44:23
【问题描述】:

我的 index.js 中有这段代码

...
import userRoutes from './src/routes/userRoutes';
import invoicesRoutes from './src/routes/invoicesRoutes';
import authMiddleware from "./src/middlewares/authMiddleware";
...
const app = express();
...
app.use('/user', authMiddleware, userRoutes(app));
app.use('/invoices', authMiddleware, invoicesRoutes(app));

我的授权中间件

const authMiddleware = (req, res, next) => {
    if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {
        console.log(req.headers.authorization.split(' ')[0]);
        next();
    } else {
        console.log('else');
        next();
    }
};

export default authMiddleware;

还有我的一条路线:

import { register, login } from '../controllers/authController';

const userRoutes = (app) => {
    app.route('/user/signup')
        .post(register);
    app.route('/user/login')
        .post(login);
};

export default userRoutes;

我收到一个错误:

throw new TypeError('Router.use() 需要一个中间件函数但是 得到一个 ' + gettype(fn)) ^

TypeError: Router.use() 需要一个中间件函数,但得到了一个 未定义

怎么了?

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

    您将路由初始化作为中间件功能传递 app.use('/user', authMiddleware, userRoutes(app));

    在这行代码中,userRoutes(app) 应该返回的是function(req,res[,next]){}

    应该是这样的

    app.use('/user', authMiddleware, (req, res, next) => {
            userRoutes(app);
            next()
    })
    

    而你所做的是

    app.use('/user', authMiddleware, (app) => {
        app.route('/user/signup').post(register);
        app.route('/user/login').post(login);
    })
    

    错了

    这里似乎有一些错误的逻辑,因为据我了解,您必须调用 http://localhost/user 来初始化路由,并且由于包含 express 的中间件,这将无法正常工作。

    根据我的理解,您正在尝试做的事情应该看起来更像这样

    ...
    import userRoutes from './src/routes/userRoutes';
    import invoicesRoutes from './src/routes/invoicesRoutes';
    ...
    const app = express();
    userRoutes(app);
    invoicesRoutes(app);
    

    import { register, login } from '../controllers/authController';
    import authMiddleware from "./middleware";
    const userRoutes = (app) => {
        app.post('/user/signup', authMiddleware, register);
        app.post('/user/login', authMiddleware, login);
    };
    
    export default userRoutes;
    

    【讨论】:

      【解决方案2】:

      Express 已经提供了Router class 来分隔不同子模块中的路由,所以你可以在不传递app 变量的情况下导入userRoutes 模块,这里是一个例子:

      userRoutes.js

      import { register, login } from '../controllers/authController';
      import express from 'express';
      
      const router = express.Router();
      
      router.route('/signup')
              .post(register);
      
      router.route('/login')
              .post(login);
      
      export default router;
      

      index.js

      ...
      import userRoutes from './src/routes/userRoutes';
      import invoicesRoutes from './src/routes/invoicesRoutes';
      import authMiddleware from "./src/middlewares/authMiddleware";
      ...
      const app = express();
      ...
      app.use('/user', authMiddleware, userRoutes);
      app.use('/invoices', authMiddleware, invoicesRoutes);
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        检查所有 JavaScript 文件,确保没有遗漏这一行:

        module.exports = router
        

        【讨论】:

          【解决方案4】:

          在我的 route.js 中

          我是这样写的 module.exports = routes;

          我打算做的是导出路线,在像下面这样更改之后我的错误消失了 module.exports = {routes};

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-14
            • 2015-04-17
            • 1970-01-01
            • 2020-12-27
            • 1970-01-01
            • 2017-10-20
            • 2019-04-21
            • 2019-12-23
            相关资源
            最近更新 更多