我在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));
我的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;
和我的一条路线:
import { register, login } from '../controllers/authController';
const userRoutes = (app) => {
app.route('/user/signup')
.post(register);
app.route('/user/login')
.post(login);
};
export default userRoutes;
我收到错误:
抛出新的TypeError(' Router.use()需要一个中间件函数但是 得到了一个' + gettype(fn)) ^
TypeError:Router.use()需要一个中间件函数但得到了一个 未定义
出了什么问题?
答案 0 :(得分:3)
您将路由初始化作为中间件功能传递
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
来初始化路由,并且由于明确的中间件包含而无法正常工作。
再次从我的理解中你想要做的事情看起来应该更像这样
...
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;
答案 1 :(得分:0)
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);
希望这有帮助
答案 2 :(得分:0)
检查所有 JavaScript 文件以确保没有遗漏这一行:
module.exports = router
答案 3 :(得分:0)
在我的 route.js 中
我是这样说的
module.exports = routes;
我打算做的是导出路由,像下面这样更改后,我的错误消失了
module.exports = {routes};