【问题标题】:Getting TypeError: Router.use() requires a middleware function but got a undefined获取 TypeError:Router.use() 需要一个中间件函数,但有一个未定义的
【发布时间】: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); 所建议的那样

标签: node.js express


【解决方案1】:

看起来你导出的对象在这里被覆盖了

module.exports = router;
module.exports = products;

本质上,您只导出products 对象。 试试

module.exports = { router, products };

app.use('/admin', adminData.router);

【讨论】:

  • 您确定您的关注正确吗?我可以看看你更新的源代码吗? @RohanDongre
  • admin.js module.exports = { router, products }; app.js 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); app.use(adminData); app.use(shopRoutes.router); app.listen(3000, () => { console.log('Server started!!'); });
  • module.exports = {router, products} 用于shop.js
  • 我用module.exports = {router, products} 更新了我的shop.js,现在我得到了products ^ ReferenceError: products is not defined
  • app.use('/admin', adminData.router)
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2020-07-14
  • 2020-12-27
  • 2015-04-17
相关资源
最近更新 更多