【发布时间】:2019-12-29 15:27:02
【问题描述】:
我在启动服务器时收到以下代码的此错误。这段代码有什么问题?
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
shop.js:
const path = require('path')
const express = require('express');
const rootDir = require('../util/path');
const adminData = require('./admin');
const router = express.Router();
router.get('/', (req, res, next) => {
const products = adminData.products;
res.render('shop', {
prods: products,
docTitle: 'Shop'
});
});
admin.js
module.exports = router;
const path = require('path');
const express = require('express');
const rootDir = require('../util/path');
const router = express.Router();
const products = [];
// /admin/add-product => GET
router.get('/add-product', (req, res, next) => {
res.sendFile(path.join(rootDir, 'views', 'add-product.html'));
});
// /admin/add-product => POST
router.post('/add-product', (req, res, next) => {
products.push({
title: req.body.title
});
res.redirect('/');
});
module.exports = router;
module.exports = products;
app.js:
const path = require('path');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.set('view engine', 'pug');
app.set('views', 'views');
const adminData = require('./routes/admin');
const shopRoutes = require('./routes/shop');
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/admin', adminData.routes);
app.use(shopRoutes);
app.use((req, res, next) => {
res.status(404).sendFile(path.join(__dirname, 'views', '404.html'));
});
app.listen(3000, () => {
console.log('Server started!!');
});
【问题讨论】:
-
可能是因为忘记从 shop.js 导出路由器。
module.exports = router在 shop.js 中 -
@MohitYadav:感谢您的指出,但如果您看到我的 admin.js 第一行是来自 shop.js 的
module.exports = router; -
好的,然后试试
app.use('/', shopRoutes) -
@MohitYadav:我根据您在 app.js 文件中的建议修改了我的代码,但这并没有解决我的问题。在 app.js
app.use('/admin', adminData.routes);中,这段代码被破坏了。 -
这里是 codesandbox,正如 admin.js 中的 @stanley
module.exports = { router, products };和 app.js 中的app.use("/admin", adminData.router);所建议的那样