TypeError: Router.use () ต้องการฟังก์ชั่นมิดเดิลแวร์ แต่มี Object


175

มีการเปลี่ยนแปลงมิดเดิลแวร์ในการแสดง 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


3
โปรดแสดงข้อความข้อผิดพลาดจริง
thefourtheye

ทำอะไรroutes/indexและroutes/usersส่งคืน
เม็ดยาระเบิด

1
ไม่ได้กำหนด! บางคน (อาจเป็นฉัน) ได้แสดงความคิดเห็นออก module.exports ในหน้าดัชนี? อย่างไรก็ตามฉันไม่ใส่เครื่องหมายบรรทัดและเพิ่มเส้นทาง var และอย่างน้อยเซิร์ฟเวอร์ก็เริ่มทำงาน
2557

@Datise - ดูเหมือนว่าคุณได้ทำเครื่องหมายคำตอบที่ผิดเป็นคำตอบของคุณ
Varun

ฉันได้รับข้อผิดพลาดเดียวกัน แต่ฉันลืมส่งออกคอนโทรลเลอร์
doobean

คำตอบ:


12

หากคุณใช้ด่วนมากกว่า 2.x คุณต้องประกาศแอปเช่นรหัสด้านล่าง โปรดลองแทนที่รหัสของคุณ

app.use('/', routes);

กับ

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

โปรดคลิกที่นี่เพื่อรับรายละเอียดเพิ่มเติมเกี่ยวกับ app.router

ขอบคุณ

บันทึก:

app.router ถูกคิดค่าเสื่อมราคาใน express 3.0+ หากคุณใช้ express 3.0+ โปรดดูคำตอบของ Anirudh ด้านล่าง


10
เพียงแค่ทราบว่า app.router เลิกใช้แล้ว: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
การแก้ไขที่เป็นไปได้มากที่สุดสำหรับกรณีส่วนใหญ่คือคำตอบของ @ Anirudh ด้านล่าง
geeky_monster

4
ฉันพบว่าคำตอบนี้ทำให้เข้าใจผิด คำตอบที่ดีกว่าคือ @Anirudh ด้านล่าง
rotarydial

คำตอบด้านล่างดีกว่าที่คนอื่น ๆ ได้กล่าวถึง
RaneWrites

939

ในหน้าใดหน้าหนึ่งของคุณคุณหายไป

module.exports = router;

ตรวจสอบและตรวจสอบหน้า JS ทั้งหมดของคุณ


1
@Anirudh Mind อธิบายถึงสาเหตุของข้อผิดพลาดเช่นกัน
ฮัล

@Anirudh ขอบคุณมันมีประโยชน์ แต่วิธีการส่งออกเราเตอร์ที่นี่ใน ES6? ง่าย ๆexport {router}ก็ให้ข้อผิดพลาดนั่น
adi

3
@adi stackoverflow.com/questions/38550979/ ที่นี่คุณไป :)
Anirudh

โดยสรุปแล้วนี่เป็นหน้าสุดท้ายของคุณ js
AndrewLeonardi

3
ฉันหายไปsตอนท้าย: |
มูฮัมหมัดอูเมอร์

70

วิธีแก้ปัญหาง่ายๆถ้าคุณใช้ด่วนและกำลังทำอยู่

const router = express.Router();

ทำให้แน่ใจว่า

module.exports = router ;

ในตอนท้ายของหน้า


สิ่งนี้ไม่ได้เขียนทับคุณสมบัติอื่น ๆ ภายใต้การส่งออกหรือไม่ ฉันกำลังส่งออกหลายรายการ
TheRealChx101

3

ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกัน แต่มีปัญหาอื่น โพสต์สำหรับคนอื่น ๆ ที่ติดอยู่ในเดียวกัน

ฉันรังเพลิงget, post, put, deleteฟังก์ชั่นไปยังไฟล์เราเตอร์ใหม่ในขณะที่ refactoring และลืมที่จะแก้ไขเส้นทาง ตัวอย่าง:

ไม่ถูกต้อง:

//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;


ฉันมีข้อผิดพลาดคล้ายกันเมื่อฉันอ้างถึงเส้นทางที่ไม่มีอยู่จริง
NiallJG

3

ตรวจสอบไฟล์ 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

module.exports = เราเตอร์

ถ้าไม่มีเพิ่มและmodule.exports = เราเตอร์ทำงานอีกครั้ง


หากข้อผิดพลาดของคุณคือ: "TypeError: Route.post () หรือ Route.get () ต้องใช้ฟังก์ชันมิดเดิลแวร์ แต่มีวัตถุ"

goto controller.js (เช่น usersController) และตรวจสอบชื่อฟังก์ชั่นทั้งหมดที่คุณอาจสะกดผิดหรือคุณให้ไว้ในไฟล์ฟังก์ชั่นเส้นทาง แต่พลาดใน 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)
        })
}

ใน route.js ฉันได้รับสองเส้นทาง แต่ในตัวควบคุมฉันพลาดที่จะกำหนดเส้นทางสำหรับ

router.post ( '/ ผู้ใช้ / การเข้าสู่ระบบ)

สิ่งนี้จะทำให้เกิดข้อผิดพลาด **

"TypeError: route.post () ต้องใช้ฟังก์ชันมิดเดิลแวร์ แต่มีวัตถุ"

**


นั่นคือสิ่งที่ฉันหายไป! คำสั่งการส่งออก !!
saibbyweb

1

ฉันพบข้อผิดพลาดและวิธีแก้ปัญหาซึ่งโพสต์โดย Anirudh ฉันสร้างเทมเพลตสำหรับการกำหนดเส้นทางด่วนและลืมความแตกต่างนิดหน่อย - ดีใจที่แก้ไขได้ง่าย

ฉันต้องการให้คำอธิบายเล็กน้อยเกี่ยวกับคำตอบของเขาที่จะวางรหัสนี้โดยอธิบายโครงสร้างไฟล์ของฉัน

โครงสร้างไฟล์ทั่วไปของฉันเป็นดังนี้:

/lib

/routes

---index.js (ควบคุมการนำทางหลัก)

/page-one



/page-two



     ---index.js

(แต่ละไฟล์ [ในกรณีของฉัน index.js ภายในหน้าสองแม้ว่าหน้าหนึ่งจะมี index.js ด้วย] - สำหรับแต่ละหน้า - ที่ใช้app.METHODหรือrouter.METHODจำเป็นต้องมีmodule.exports = router;ในตอนท้าย)

หากมีคนต้องการฉันจะโพสต์ลิงก์ไปยังเทมเพลต Github ที่ใช้การกำหนดเส้นทางด่วนโดยใช้แนวทางปฏิบัติที่ดีที่สุด แจ้งให้เราทราบ

ขอบคุณ Anirudh !!! สำหรับคำตอบที่ดี


1

ตรวจสอบไฟล์ทั้งหมดของคุณ:

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

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

บันทึกอย่างถูกต้องในกรณีของฉันไฟล์หนึ่งหายไปและทิ้งข้อผิดพลาดเดียวกัน


0

ในกรณีของฉันฉันไม่ได้ส่งออกโมดูล module.exports = router;


สิ่งนี้แตกต่างจากคำตอบสองคำตอบข้างต้นอย่างไรmodule.exports = router;
Akin Okegbile

โอ้ฉันสามารถเห็นพวกเขาที่ด้านล่างขอโทษสำหรับการทำซ้ำ
Usama Tahir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.