Router.use()需要一个中间件函数但是未定义

gsi*_*dze 5 javascript middleware node.js express

我在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));
Run Code Online (Sandbox Code Playgroud)

我的authmiddleware

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;
Run Code Online (Sandbox Code Playgroud)

和我的一条路线:

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

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

export default userRoutes;
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

抛出新的TypeError('Router.use()需要一个中间件函数,但得到'+ gettype(fn))^

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

怎么了?

Sta*_*mos 4

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

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

它应该是这样的

app.use('/user', authMiddleware, (req, res, next) => {
        userRoutes(app);
        next()
})
Run Code Online (Sandbox Code Playgroud)

你所做的是

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

那是错的

这里似乎有一些不好的逻辑,因为根据我的理解,你将不得不调用http://localhost/user来初始化路由,并且由于包含了 Express 的中间件,这将无法很好地工作。

再次据我了解,您想要做的事情应该看起来更像这样

...
import userRoutes from './src/routes/userRoutes';
import invoicesRoutes from './src/routes/invoicesRoutes';
...
const app = express();
userRoutes(app);
invoicesRoutes(app);
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)