TypeError : Router.use ()에는 미들웨어 함수가 필요하지만 객체가 있습니다.


175

새 Express Express 버전에서 약간의 미들웨어 변경이 있었으며이 문제에 대한 다른 게시물 중 일부에서 내 코드에서 일부 변경을 수행했지만 아무 것도 고칠 수 없습니다.

사전에 작동했지만 변경 내용을 기억할 수 없습니다.

throw new TypeError('Router.use() requires middleware function but got a
        ^
TypeError: Router.use() requires middleware function but got a Object

node ./bin/www

js-bson: Failed to load c++ bson extension, using pure JS version
js-bson: Failed to load c++ bson extension, using pure JS version

/Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:438
      throw new TypeError('Router.use() requires middleware function but got a
            ^
TypeError: Router.use() requires middleware function but got a Object
    at /Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:438:13
    at Array.forEach (native)
    at Function.use (/Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:436:13)
    at /Users/datis/Documents/bb-dashboard/node_modules/express/lib/application.js:188:21
    at Array.forEach (native)
    at Function.use (/Users/datis/Documents/bb-dashboard/node_modules/express/lib/application.js:185:7)
    at Object.<anonymous> (/Users/datis/Documents/bb-dashboard/app.js:46:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)

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 mongoose = require('mongoose');
var session = require('express-session');
var MongoClient = require('mongodb').MongoClient;
var routes = require('./routes/index');
var users = require('./routes/users');

var Users = require('./models/user');
var Items = require('./models/item');
var Store = require('./models/store');
var StoreItem = require('./models/storeitem');

var app = express();
//set mongo db connection
var db = mongoose.connection; 

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});
// var MONGOHQ_URL="mongodb://localhost:27017/test" 

// 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: false }));
app.use(cookieParser());
app.use(session({
    secret: 'something',
    resave: true,
    saveUninitialized: true
}));

app.use('/', routes);
app.use('/users', users);
app.use(express.static(path.join(__dirname, 'public')));

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

// Make our db accessible to our router
app.use(function(req, res, next){
  req.db = db;
  next();
});

// 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;

이 질문에 대한 답변은 버전 관리상의 이유로 변경되었습니다. Nik 덕분에


3
실제 오류 메시지를 알려주십시오
thefourtheye

무엇을 routes/index하고 routes/users돌아 옵니까?
폭발 환약

1
찾으시는 주소가 없습니다! 누군가 (아마도) 인덱스 페이지에서 module.exports를 주석 처리 했습니까? 어쨌든 나는 줄의 주석을 해제하고 var 경로를 추가했으며 적어도 서버가 시작 중입니다.
Datise

@Datise-당신이 당신의 답변으로 잘못된 답변을 표시 한 것 같습니다
Varun

나는 같은 오류가 발생했습니다하지만 난 컨트롤러를 수출하는 것을 잊었다
doobean

답변:


12

2.x 이상의 express를 사용하는 경우 아래 코드와 같이 app.router를 선언해야합니다. 코드를 교체하십시오

app.use('/', routes);

app.use(app.router);
routes.initialize(app);

하시기 바랍니다 여기를 클릭 app.router에 대한 자세한 정보를 얻을 수

감사

노트 :

app.router는 express 3.0 이상에서 감가 상각됩니다. express 3.0 이상을 사용하는 경우 아래 Anirudh의 답변을 참조하십시오.


10
app.router는 더 이상 사용되지 않습니다. github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
대부분의 경우에 가장 가능성이 높은 해결책은 아래 @Anirudh의 답변입니다.
geeky_monster 2016 년

4
이 답변이 오도 된 것으로 나타났습니다. 더 좋은 대답은 아래 @Anirudh입니다.
로터리 다이얼

다른 사람들이 언급했듯이 아래 답변이 더 좋습니다.
RaneWrites

938

귀하의 js 페이지 중 하나에서 누락되었습니다

module.exports = router;

모든 JS 페이지 확인 및 확인


1
@Anirudh Mind도 오류의 원인을 설명합니다
sac Dahal

@Anirudh, 도움이되었지만 ES6에서 라우터를 내보내는 방법은 무엇입니까? 간단한 export {router}또한 그 오류를 제공
adi

3
@adi stackoverflow.com/questions/38550979/… 여기 당신이 간다 :)
Anirudh

가치는 지적이 당신의 js 페이지의 맨 끝에 일반적으로
AndrewLeonardi

3
글쎄, 나는 s끝에 누락되었습니다 : |
Muhammad Umer

70

당신이 표현을 사용하고있는 경우 간단한 솔루션

const router = express.Router();

확인

module.exports = router ;

페이지 끝에서


내보내기에서 다른 속성을 덮어 쓰지 않습니까? 여러 개를 내보내고 있습니다.
TheRealChx101

3

동일한 오류 메시지가 표시되었지만 다른 문제가있었습니다. 똑같이 붙어있는 다른 사람들을 위해 게시.

나는 포팅 get, post, put, delete새로운 라우터 파일 기능을 리팩토링 동안, 그리고 경로를 편집하는 것을 잊었다. 예:

잘못됨 :

//server.js
app.use('/blog-posts', blogPostsRouter);

//routers/blogPostsRouter.js
router.get('/blog-posts', (req, res) => {
  res.json(BlogPosts.get());
});

옳은:

//server.js
app.use('/blog-posts', blogPostsRouter);

//routers/blogPostsRouter.js
router.get('/', (req, res) => {
  res.json(BlogPosts.get());
});

객체에서 인수를 줄 바꿈하거나 구문을 놓친 구문을 확인하는 동안 오류가 발생하여 발견하는 데 시간이 걸렸습니다. module.exports = router;


존재하지 않는 경로를 참조 할 때 비슷한 오류가 발생했습니다
NiallJG

3

route.js 파일을 확인하십시오

예 내 route.js

    const express = require('express')
    const router = express.Router()
    
    const usersController = require('../app/controllers/usersController')
    const autheticateuser = require('../app/middlewares/authentication')
    
    router.post('/users/login', autheticateuser, usersController.login)
    router.post('/users/register', autheticateuser, usersController.register)
      

routes.js의 끝을 확인하십시오

module.exports = 라우터

거기에 없으면 add 및 module.exports = 라우터 가 다시 실행됩니다


오류가 "TypeError : Route.post () 또는 Route.get () 인 경우 에 미들웨어 함수가 필요하지만 오브젝트가 있음"인 경우

controller.js (예 : usersController)로 이동하여 철자가 틀리거나 함수 경로 파일에 있지만 제어자가 놓친 모든 함수 이름을 확인하십시오.

const User = require('../models/user')
const express = require('express')
const router = express.Router()



module.exports.register = (req, res) => {
    const data = req.body
    const user = new User(data)
    user.save()
        .then((user) => {
            res.send(user)
        })
        .catch((err) => {
            res.json(err)
        })
}

routes.js에서 두 개의 경로를 제공했지만 컨트롤러에서는 경로를 정의하기 위해 놓쳤습니다.

router.post ( '/ users / login')

이 오류가 발생합니다 **

"TypeError : route.post ()에는 미들웨어 함수가 필요하지만 오브젝트가 있습니다"

**


바로 내가 놓친 것입니다! 수출 성명 !!
saibbyweb

1

Anirudh가 게시 한이 오류 및 솔루션 도움말이 있습니다. 빠른 라우팅을위한 템플릿을 구축하고이 뉘앙스를 잊어 버렸습니다. 쉽게 고칠 수있었습니다.

내 파일 구조를 설명 하여이 코드를 어디에 넣을 지에 대한 그의 대답을 약간 설명하고 싶었습니다.

내 일반적인 파일 구조는 다음과 같습니다.

/lib

/routes

---index.js (주 탐색을 제어)

/page-one



/page-two



     ---index.js

(각 파일 (내 경우에는 페이지 2의 index.js는 페이지 1에도 index.js가 있지만)-각 페이지마다- 마지막에 사용 app.METHOD하거나 router.METHOD필요로 module.exports = router;하는)

누군가 원한다면 모범 사례를 사용하여 빠른 라우팅을 구현하는 github 템플릿에 대한 링크를 게시합니다. 알려주세요

감사합니다 Anirudh !!! 큰 답변입니다.


1

이 파일들을 모두 확인하십시오 :

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

var Users = require('./models/user');
var Items = require('./models/item');

제대로 저장하십시오. 제 경우에는 하나의 파일이 누락되어 같은 오류가 발생합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.