当我运行npm start运行我的快速应用程序时,我收到此错误。
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。我不知道我哪里出错了。有人能看出我的问题是什么吗?
答案 0 :(得分:59)
我在Kop4lyf的评论中找到了答案:
检查你的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 question或offcial Node.js documentation。
答案 1 :(得分:12)
我通过添加我正在某处使用的方法来解决这个问题。所以,请检查您的所有出口。
0xBF13D000
答案 2 :(得分:5)
如果您在路线中使用
exports default router
您的解决方案可以
module.exports = router
答案 3 :(得分:3)
您的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;
答案 4 :(得分:1)
我有同样的错误,将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 Express和Express 4.x API
答案 5 :(得分:1)
哇,我的问题是我在做 module.exports = { router } 而不是 module.exports = router
答案 6 :(得分:0)
当您忘记导出使用路由器的模块时,会出现此错误。
您提到的代码在进行一些调整后可以完美地工作。
如果您的app.js是应用程序的主要/起点。
应该有
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}...`));
代替
module.exports = app;
(可选)通常index.js用于应用程序的起点。将index.js重命名为helloworld.js,并在require语句中更改
var routes = require('./routes/index');
到
var routes = require('./routes/helloworld');
使用以下命令运行此应用
node app.js
答案 7 :(得分:0)
如果您已经检查了所有解决方案,但也没有此错误,请选中该解决方案
发生此错误的另一个原因是调用了不存在或未导出的方法。 就我而言,我正在调用 login 方法,但是我忘了定义它们
我正试图调用此方法
app.post('/api/login', db.login);
但是我忘了创建登录方法,所以出现了此错误。还要尝试检查拼写错误,可能是您输入的拼写错误
答案 8 :(得分:0)
我遇到了同样的问题,然后发现我的一个控制器中缺少此行!
return api;
//对于您的代码,可能是return router
!
我将此行添加到了代码中,并且工作正常。
答案 9 :(得分:0)
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;
答案 10 :(得分:0)
我经过很多努力才发现它!由于所有语法都正确,因此编写的代码没有错,这是由于尚未编写的代码!如果您已实现index.js,但尚未实现users.js,则可能会发生这种情况。但是,您已经定义了这两行 app.use('/',路线); app.use('/ users',用户); 如果您渴望立即测试index.js,而无需等待users.js的实现。正是在这种情况下出错。
答案 11 :(得分:0)
如果您仍然遇到此问题并尝试所有解决方案,则只需将路由器替换为路由即可,并且效果很好
答案 12 :(得分:-2)
我通过移除app.use(/users, users);
我现在不需要这个,所以也许这就是它开始打破的原因。