【问题标题】:Express error - TypeError: Router.use() requires middleware function but got a ObjectExpress 错误 - TypeError: Router.use() 需要中间件功能但得到了一个对象
【发布时间】:2015-07-08 14:09:29
【问题描述】:

当我运行 npm start 来运行我的 express 应用程序时,我收到了这个错误。

TypeError: Router.use() requires middleware function but got a Object

我的 app.js 代码

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);



/// catch 404 and forwarding to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

module.exports = app;

我的 index.js 代码

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
    res.render('index', { title: 'Express' });
});

/* GET Hello World page. */
router.get('/helloworld', function(req, res) {
    res.render('helloworld', { title: 'Hello, World!' })
});

module.exports = router;

我对使用 Node 和 express 很陌生。我看不到我哪里出错了。任何人都可以看到我的问题是什么?

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

我通过删除 app.use(/users, users); 来修复它

我现在不需要这个,所以也许这就是它开始坏的原因。

【讨论】:

  • 检查您的 users.js。如果你可以试试的话,它也应该像 index.js 一样导出路由器。
  • 是的,我错过了 var express = require('express'); var router = express.Router(); module.exports = 路由器;
【解决方案2】:

我在Kop4lyf的cmets中找到了答案:

检查您的 users.js。它也应该像出口路由器一样 index.js,如果你可以试试。

但是,当我遇到这个问题时,这个问题是我的热门搜索结果,所以我正在推广一个答案。


该错误是因为您的一个路由模块没有被导出 - 这意味着 Express 在尝试识别您的所有路由时无法访问它。

您可以通过在每个路由文件的末尾添加 module.exports = router; 来解决此问题。

例子:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
     //Do whatever...
});

module.exports = router;

有关module.exports 的更多信息,请访问this questionoffcial Node.js documentation

【讨论】:

  • 这对我有用!实际上我们必须导入路由器模块
  • 谢谢。这是任何新手都能理解的完美答案。它帮助了我。
  • 谢谢@HPierce。我没有在两个控制器中导出路由器。我只做了一个。现在它已修复。
【解决方案3】:

我已经通过添加我在某处使用的来解决这个问题。所以请检查您的所有出口。

module.exports = router;

【讨论】:

    【解决方案4】:

    当您忘记导出使用路由器的模块时会出现此错误。

    您提到的代码经过一些调整即可完美运行。

    如果您的 app.js 是应用的主要/起点。

    应该有

    const port = process.env.PORT || 3000;
    app.listen(port, () => console.log(`Listening on port ${port}...`));
    

    而不是

    module.exports = app;
    

    (可选)一般使用index.js作为app的起点。将 index.js 重命名为 helloworld.js 并在 require 语句中进行相同的更改

    var routes = require('./routes/index');
    

    var routes = require('./routes/helloworld');
    

    使用以下命令运行此应用

    node app.js
    

    【讨论】:

      【解决方案5】:

      您的 index.js 文件很好,您只需创建 users.js 并导出它。

         let express = require('express');
         let router = express.Router();
      
        //Login Page - GET REQUEST
         router.get('/login',(req,res)=> {
            res.send('login page');
        })
      
      
        //Register Page - GET REQUEST
        router.get('/register',(req,res)=> {
           res.send('register page');
        });
      
        module.exports = router;
      

      【讨论】:

        【解决方案6】:

        如果您检查了所有解决方案而不是出现此错误,请检查此错误

        出现此错误的另一个原因是调用不存在或未导出的方法。 就我而言,我正在调用 login 方法,但我忘了定义它们

        我试图调用这个方法

        app.post('/api/login', db.login);
        

        但我忘了创建登录方法,所以我收到了这个错误。也尝试检查拼写错误可能是您输入了错误的拼写

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题,然后我发现我的一个控制器中缺少这一行!

          return api; //你的代码可能是return router

          我将此行添加到我的代码中,它运行良好。

          【讨论】:

            【解决方案8】:
            in every module  **export the router** and **keep one handler for the default 
            path '/'**
            
            // in index.js
            const authRoute = require("./routes/authRoute");
            
            app.use("/auth", authRoute);
            
            
            // in authRoute.js
            
            const express = require("express");
            const router = express.Router();
            router.get("/", (req, res) => {
                // code
             });
            
            module.exports = router;
            

            【讨论】:

              【解决方案9】:

              经过一番挣扎,我找到了它!由于一切语法正确,编写的代码没有错,这是由于尚未编写的代码!如果您已实现 index.js 但尚未实现 users.js,则可能会发生这种情况。但是,您已经定义了这两行 app.use('/', 路线); app.use('/users', users); 如果您渴望立即测试 index.js 而无需等待 users.js 实现。那正是它出错的时候。

              【讨论】:

                【解决方案10】:

                如果您仍然面临这个问题并尝试所有解决方案,那么只需将路由器替换为路由,它就可以正常工作

                【讨论】:

                  【解决方案11】:

                  如果你在路线中使用

                  exports default router
                  

                  你的解决方案可以是

                  module.exports = router
                  

                  【讨论】:

                  • 如果您使用的是exports default router,另一种解决方案是使用require('./path/to/router).default
                  【解决方案12】:

                  我遇到了同样的错误,通过将app.use('view engine', 'ejs') 替换为app.set('view engine', 'ejs') 来修复它。 作为参考,我使用了这个网页Migrating from 3.x to 4.x

                  我不必对 index.js 或 application.js 进行任何更改。有关 EJS 的更多信息,请参阅 Using EJS with ExpressExpress 4.x API

                  【讨论】:

                    【解决方案13】:

                    哇,我的问题是我在做 module.exports = { router } 而不是 module.exports = router

                    【讨论】:

                    • 请详细填写
                    • 我试图导出 {router}
                    猜你喜欢
                    • 2015-02-12
                    • 2018-09-27
                    • 2016-02-13
                    • 1970-01-01
                    • 2019-12-23
                    • 1970-01-01
                    • 2021-06-24
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多