TypeError: Router.use () membutuhkan fungsi middleware tetapi mendapat Object


175

Ada beberapa perubahan middleware pada versi baru express dan saya telah membuat beberapa perubahan dalam kode saya di sekitar beberapa posting lain tentang masalah ini, tetapi saya tidak bisa mendapatkan apa pun untuk tetap.

Kami sudah bekerja sebelumnya, tetapi saya tidak ingat apa perubahannya.

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;

Tampaknya jawaban untuk pertanyaan ini telah berubah karena alasan versi. Terima kasih kepada Nik


3
Tolong tunjukkan kepada kami pesan kesalahan yang sebenarnya
thefourtheye

Apa yang dilakukan routes/indexdan routes/usersdikembalikan?
Pil Ledakan

1
TIDAK TERDEFINISI! seseorang (mungkin saya) telah berkomentar module.exports di halaman indeks? Pokoknya saya membatalkan komentar baris dan menambahkan rute var dan setidaknya server memulai.
Datise

@Datise - sepertinya Anda telah menandai jawaban yang salah sebagai jawaban Anda
Varun

Saya mendapat kesalahan yang sama tetapi saya lupa mengekspor controller
doobean

Jawaban:


12

Jika Anda menggunakan express di atas 2.x, Anda harus mendeklarasikan app.router seperti kode di bawah ini. Silakan coba ganti kode Anda

app.use('/', routes);

dengan

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

Silakan klik di sini untuk mendapatkan detail lebih lanjut tentang app.router

Terima kasih

catatan:

app.router disusutkan dalam express 3.0+. Jika Anda menggunakan express 3.0+, lihat jawaban Anirudh di bawah ini.


10
Perhatikan bahwa app.router sudah tidak digunakan lagi: github.com/strongloop/express/wiki/Migrating-dari-3.x-to-4.x
Nik

11
Perbaikan paling mungkin untuk sebagian besar kasus tersebut adalah jawaban @ Anirudh di bawah ini.
geeky_monster

4
Saya menemukan jawaban ini menyesatkan. Jawaban yang lebih baik adalah dengan @Anirudh di bawah ini.
putar

Jawaban di bawah ini lebih baik, seperti yang lain telah disebutkan.
RaneWrites

939

Di salah satu halaman js Anda, Anda tidak ada

module.exports = router;

Periksa dan verifikasi semua halaman JS Anda


1
@Anirudh Pikiran menggambarkan alasan kesalahan juga
kantung Dahal

@Anirudh, terima kasih itu membantu tetapi bagaimana mengekspor router di ES6? sederhana export {router}juga memberikan kesalahan itu
adi


Patut dicatat bahwa ini biasanya ada di akhir halaman js Anda
AndrewLeonardi

3
baik saya kehilangan sdi akhir: |
Muhammad Umer

70

Solusi sederhana jika Anda menggunakan express dan doing

const router = express.Router();

pastikan untuk

module.exports = router ;

di akhir halaman Anda


Bukankah ini menimpa properti lain di bawah ekspor? Saya mengekspor banyak.
TheRealChx101

3

Saya mendapatkan pesan kesalahan yang sama tetapi memiliki masalah yang berbeda. Posting untuk orang lain yang macet sama.

Aku porting get, post, put,delete fungsi ke file router baru sementara refactoring, dan lupa untuk mengedit jalur. Contoh:

Salah:

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

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

Benar:

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

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

Butuh beberapa saat untuk mengenali, karena kesalahan saya memeriksa sintaksis di mana saya mungkin telah membungkus argumen dalam suatu objek atau di mana saya melewatkan module.exports = router;


Saya memiliki kesalahan serupa ketika saya mereferensikan rute yang tidak ada
NiallJG

3

periksa file route.js Anda

contoh route.js saya

    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)
      

periksa ujung route.js

module.exports = router

jika tidak ada tambahkan dan module.exports = router jalankan lagi


Jika Kesalahan Anda adalah: "TypeError: Route.post () atau Route.get () membutuhkan fungsi middleware tetapi mendapat Object"

goto controller.js (ie, usersController) dan periksa semua nama fungsi yang mungkin Anda salah eja, atau Anda berikan dalam file rute fungsi tetapi tidak terjawab di contollers

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

di routes.js saya diberikan dua rute tetapi di controller saya tidak bisa menentukan rute

router.post ('/ pengguna / login')

ini akan membuat kesalahan **

"TypeError: route.post () membutuhkan fungsi middleware tetapi mendapat Object"

**


Itulah tepatnya yang saya lewatkan! Pernyataan ekspor !!
saibbyweb

1

Saya memiliki kesalahan dan bantuan solusi ini yang diposting oleh Anirudh. Saya membuat templat untuk perutean cepat dan lupa tentang nuansa ini - senang itu mudah diperbaiki.

Saya ingin memberikan sedikit klarifikasi untuk jawabannya di mana harus meletakkan kode ini dengan menjelaskan struktur file saya.

Struktur file khas saya adalah sebagai berikut:

/lib

/routes

---index.js (mengontrol navigasi utama)

/page-one



/page-two



     ---index.js

(setiap file [dalam kasus saya index.js dalam halaman-dua, meskipun halaman-satu akan memiliki index.js juga] - untuk setiap halaman - yang menggunakan app.METHODatau router.METHODperlu memilikimodule.exports = router; di akhir)

Jika seseorang mau, saya akan memposting tautan ke template github yang mengimplementasikan perutean cepat menggunakan praktik terbaik. biarkan aku tahu

Terima kasih Anirudh !!! untuk jawaban yang bagus


1

Periksa semua file Anda ini:

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

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

Simpan dengan benar, Dalam kasus saya, satu file terlewatkan dan melempar kesalahan yang sama


0

Dalam kasus saya, saya tidak mengekspor modul. module.exports = router;


Bagaimana ini berbeda dari dua jawaban di atas yang mengatakanmodule.exports = router;
Akin Okegbile

Ohh saya bisa melihat mereka di bagian bawah maaf untuk duplikasi
Usama Tahir
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.