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

Datise
sumber
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.

Rahul Radhakrishnan
sumber
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

Anirudh
sumber
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

Parikshit Hooda
sumber
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;

Michael Staton
sumber
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"

**

K23raj
sumber
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

Joseph Zapantis
sumber
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

Ramesh Sharma
sumber
0

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

Usama Tahir
sumber
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