programing

TypeError: router.use()에 미들웨어 기능이 필요하지만 오브젝트를 취득했습니다.

sourcejob 2022. 9. 27. 23:50
반응형

TypeError: router.use()에 미들웨어 기능이 필요하지만 오브젝트를 취득했습니다.

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.module

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;

버전 관리상의 이유로 이 질문에 대한 답변이 변경된 것 같습니다.니키 덕분에

js 페이지 중 하나에서 누락됨

module.exports = router;

모든 JS 페이지를 확인하고 확인합니다.

express를 사용하여 작업을 수행하는 경우 심플한 솔루션

const router = express.Router();

꼭 하다

module.exports = router ;

페이지 말미에

저 같은 경우에는 모듈을 수출하지 않았습니다. module.exports = router;

를 사용하고 있는 경우express above 2.x, 선언해야 합니다.app.router아래 코드처럼.코드 치환을 시도해주세요.

app.use('/', routes);

와 함께

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

app.router에 대한 자세한 내용은 여기를 클릭하십시오.

주의:

app.router로 평가절하되다express 3.0+express 3.0+ 를 사용하고 있는 경우는, 다음의 Anirudh 회답을 참조해 주세요.

라우터 내보내기 모듈이 없기 때문에 이 오류가 발생합니다.

사용하다module.exports = router;그리고 그것은 효과가 있을 것이다.

routes.module 파일을 확인합니다.

예를 들어보겠습니다.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)
      

루트의 끝을 확인합니다.js

module.module = 라우터

없는 경우 add 및 module.module = 라우터를 다시 실행합니다.


에러가 "TypeError: Route.post() 또는 Route.get()은 미들웨어 함수를 필요로 하지만 오브젝트를 취득했다"인 경우

goto 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.controller에서는 2개의 루트를 지정했지만 컨트롤러에서는 루트를 정의하지 못했습니다.

router.post 사용자 / 사용자 / 사용자')

그러면 오류가 발생합니다**

"TypeError: route.post()에는 미들웨어 함수가 필요하지만 개체를 받았습니다."

**

라우터 내보내기만 하면 됩니다.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;

다음과 같은 일련의 파일을 사용했기 때문에 이 오류가 발생했습니다.

app.use('/api/someName1', someName1);
app.use('/api/someName2', someName2);
...
app.use('/api/someNameN', someNameN);

문제는 제대로 신고했는데도 파일 중 하나가 아직 비어있었다는 것입니다.다른 사람도 이런 실수를 할까 봐 그냥 두고 가는 거야.모든 사람에게 표시되는 오류 메시지와 동일한 오류 메시지가므로 다른 솔루션에 시간을 낭비하지 않도록 하기 위해

해킹을 축하합니다!

Anirudh가 올린 오류와 해결 도움말을 받았습니다.익스프레스 라우팅용 템플릿을 만들고 이 뉘앙스를 잊어버렸습니다.쉬운 수정이었으면 좋겠다고 생각했습니다.

나는 내 파일 구조를 설명함으로써 이 코드를 어디에 둘 것인가에 대한 그의 답변을 조금 더 명확하게 하고 싶었다.

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

/lib

/routes

---index.js네비게이션을 합니다).

/page-one



/page-two



     ---index.js

각 내의, 1페이지에는 index.displaces, 1페이지에는 index.dislaces]-를합니다.app.METHOD ★★★★★★★★★★★★★★★★★」router.METHOD에는 「」가 합니다.module.exports = router;에) ★★★★★★★★★★★★★★)

필요한 경우 베스트 프랙티스를 사용하여 익스프레스 루팅을 구현하는 github 템플릿 링크를 게시합니다.알려줘

고마워 Anirudh!!!좋은 답을 위해.

다음 파일을 모두 확인합니다.

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

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

적절하게 저장하십시오. 내 경우 파일 하나가 누락되어 동일한 오류가 발생했습니다.

에는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★app.use('view engine', 'ejs');app.set('view engine', 'ejs');ejs을 사용하다

였습니다.app.use(nameOfFile)수입하다

언급URL : https://stackoverflow.com/questions/27465850/typeerror-router-use-requires-middleware-function-but-got-a-object

반응형