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

Router.use() requires a middleware function but got a undefined

我的 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() requires a middleware function but got a ' + gettype(fn)) ^

TypeError: Router.use() requires a middleware function but got a undefined

怎么了?

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

在这行代码中,userRoutes(app) 应该 return 是 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;

Express 已经提供 Router class 来分隔不同子模块中的路由,因此您可以导入 userRoutes 模块而无需将 app 变量传递给它,这是一个示例:

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

希望这对您有所帮助

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

module.exports = router

在我的route.js

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

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