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

标签 javascript node.js express middleware

我的 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) 应该返回的是 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;

关于javascript - Router.use() 需要一个中间件函数,但得到了一个未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47789857/

相关文章:

javascript - 使用 D3 选择函数在 HTML 布局中正确对齐 SVG

javascript - 向文本框添加永久前缀

javascript - meteor 的 restrictCreationByEmailDomain 选项如何工作?

mysql - Node.js - 可以用于桌面应用程序开发 - MySQL、数据表和文件打开

node.js - 使用 Express 从模板内部访问 mountpath 变量

node.js - 如何将 Sequelize 查询的输出传递给另一个将使用 express 返回 JSON 对象的函数?

javascript - 从日期字符串中删除零

javascript - [c3.js]如何onclick/onmouseover到图例然后显示工具提示?

javascript - Node.js module.exports 多个类

javascript - Node.js:在同一台服务器上运行多个应用程序