TypeError: Router.use (), ara katman yazılımı işlevi gerektirir, ancak bir Nesne var


175

Express'in yeni sürümünde bazı ara katman değişiklikleri var ve bu konudaki diğer yayınların çevresinde kodumda bazı değişiklikler yaptım, ancak yapışacak bir şey alamıyorum.

Önceden çalışıyorduk ama değişikliğin ne olduğunu hatırlayamıyorum.

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;

Görünüşe göre bu sorunun cevabı versiyonlama nedenleriyle değişti. Nik'e teşekkürler


3
Lütfen bize asıl hata mesajını gösterin
thefourtheye

Ne yapar routes/indexve routes/usersgeri döner?
Patlama Hapları

1
TANIMSIZ! Birisi (muhtemelen ben) index.exports dizin sayfasında yorum yaptı? Her neyse, hattı uncommented ve bir var yollar ekledi ve en azından sunucu başlıyor.
Datise

@Datise - Cevabınız olarak yanlış cevabı işaretlemişsiniz gibi görünüyor
Varun

Aynı hatayı aldım ama denetleyiciyi dışa
aktarmayı

Yanıtlar:


12

2.x'in üstünde ekspres kullanıyorsanız, app.router'ı aşağıdaki kod gibi bildirmeniz gerekir. Lütfen kodunuzu değiştirmeyi deneyin

app.use('/', routes);

ile

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

App.router hakkında daha fazla bilgi almak için lütfen buraya tıklayın .

Teşekkürler

Not:

app.router ekspres 3.0+ ile amortismana tabi tutulur. Express 3.0+ kullanıyorsanız, aşağıdaki Anirudh'un cevabına bakın.


10
App.router'ın kullanımdan kaldırıldığını unutmayın: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
Bu tür vakaların çoğu için en olası düzeltme @ Anirudh'un aşağıdaki cevabıdır.
geeky_monster

4
Bu cevabı yanıltıcı buldum. Daha iyi cevap aşağıdaki @Anirudh tarafından.
rotarydial

Diğerlerinin de belirttiği gibi, aşağıdaki cevap daha iyidir.
RaneWrites

939

Js sayfalarınızdan herhangi birinde eksik

module.exports = router;

Tüm JS sayfalarınızı kontrol edin ve doğrulayın


1
@Anirudh Zihin de hatanın nedenini açıklayan
sac Dahal

@Anirudh, teşekkürler yardımcı oldu ama ES6 burada yönlendirici nasıl ihracat? basit export {router}de bu hatayı veriyor
adi

3
@adi stackoverflow.com/questions/38550979/... :) Gittiğiniz burada
Anirudh

Bu genellikle js sayfasının en sonunda olduğunu belirtmek gerekir
AndrewLeonardi

3
iyi ben ssonunda bir eksik : |
Muhammed Umer

70

Ekspres kullanıyorsanız ve yapıyorsanız basit çözüm

const router = express.Router();

emin ol

module.exports = router ;

sayfanızın sonunda


Bu, ihracat altındaki diğer mülklerin üzerine yazmıyor mu? Birden fazla ihracat yapıyorum.
TheRealChx101

3

Aynı hata mesajını alıyordum ama farklı bir sorunla karşılaştım. Aynı sıkışmış başkaları için gönderi.

Ben taşıdık get, post, put, deleteyeni yönlendirici dosyasına fonksiyonları üstlenmeden ederken, ve yolları düzenlemek için unuttum. Misal:

Yanlış:

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

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

Doğru:

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

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

Hata bir noktaya geldi, çünkü hata bana bir nesnede bir argümanı kaydırıyor olabileceğim ya da module.exports = router;



3

route.js dosyanızı kontrol edin

Örnek benim 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)
      

route.js'nin sonunu kontrol et

module.exports = yönlendirici

yoksa add and module.exports = yönlendirici tekrar çalıştırın


Hatanız : "TypeError: Route.post () veya Route.get () , ara katman yazılımı işlevi gerektiriyor ancak bir Nesne aldı"

goto controller.js (ör. usersController) ve yanlış yazabileceğiniz veya işlev rotaları dosyasında verdiğiniz ancak denetleyicilerde kaçırdığınız tüm işlev adlarını kontrol edin

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)
        })
}

route.js'de iki yol verdim, ancak kontrol cihazlarında,

router.post ( '/ kullanıcılar / login')

bu hata yapar **

"TypeError: route.post (), ara katman yazılımı işlevi gerektirir, ancak bir Nesneye sahiptir"

**


Tam da bunu kaçırdım! İhracat bildirimi !!
saibbyweb

1

Anirudh tarafından gönderilen bu hatayı ve çözüm yardımını aldım. Hızlı yönlendirme için bir şablon oluşturdum ve bu nüansı unuttum - kolay bir düzeltme olduğu için memnunum.

Dosya yapımı açıklayarak bu kodu nereye koyacağına dair cevabına biraz açıklama yapmak istedim.

Tipik dosya yapım şöyledir:

/lib

/routes

---index.js (ana navigasyonu kontrol eder)

/page-one



/page-two



     ---index.js

(her dosya [benim durumumda ikinci sayfada bulunan index.js, ancak bir sayfada da bir index.js bulunmalıdır ] - her sayfa için - sonunda app.METHODveya router.METHODolması gereken module.exports = router;)

Birisi isterse, en iyi uygulamaları kullanarak hızlı yönlendirme uygulayan github şablonuna bir bağlantı gönderirim. bilmeme izin ver

Anirudh teşekkürler !!! büyük cevap için.


1

Tüm bu dosyanızı kontrol edin:

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

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

Düzgün kaydet, Benim durumumda, bir dosya kaçırıldı ve aynı hatayı atıyor


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.