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

새 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 덕분에



답변

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의 답변을 참조하십시오.


답변

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

module.exports = router;

모든 JS 페이지 확인 및 확인


답변

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

const router = express.Router();

확인

module.exports = router ;

페이지 끝에서


답변

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

나는 포팅 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;


답변

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 ()에는 미들웨어 함수가 필요하지만 오브젝트가 있습니다”

**


답변

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 !!! 큰 답변입니다.


답변

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

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

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

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