TypeError: Router.use () yêu cầu chức năng phần mềm trung gian nhưng có Object


174

Đã có một số thay đổi phần mềm trung gian trên phiên bản mới của express và tôi đã thực hiện một số thay đổi trong mã của mình xung quanh một số bài đăng khác về vấn đề này nhưng tôi không thể có bất cứ điều gì để khắc phục.

Chúng tôi đã có nó hoạt động trước nhưng tôi không thể nhớ sự thay đổi là gì.

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;

Có vẻ như câu trả lời cho câu hỏi này đã thay đổi vì lý do phiên bản. Cảm ơn Nik


3
Vui lòng cho chúng tôi xem thông báo lỗi thực tế
thefourtheye 14/12/14

Làm gì routes/indexroutes/userstrở về?
Thuốc nổ

1
CHƯA XÁC ĐỊNH! ai đó (có lẽ là tôi) đã bình luận về module.exports trên trang chỉ mục? Dù sao, tôi đã bỏ dòng và thêm một tuyến var và ít nhất là máy chủ đang khởi động.
Datise

@Datise - có vẻ như bạn đã đánh dấu câu trả lời sai là câu trả lời của bạn
Varun

Tôi đã gặp một lỗi tương tự nhưng tôi đã quên xuất bộ điều khiển
doobean

Câu trả lời:


12

Nếu bạn đang sử dụng express trên 2.x, bạn phải khai báo app.router như mã bên dưới. Hãy cố gắng thay thế mã của bạn

app.use('/', routes);

với

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

Vui lòng bấm vào đây để biết thêm chi tiết về app.router

Cảm ơn

Ghi chú:

app.router bị khấu hao trong express 3.0+. Nếu bạn đang sử dụng express 3.0+, hãy tham khảo câu trả lời của Anirudh bên dưới.


10
Chỉ cần một lưu ý rằng app.router đã không được chấp nhận: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
Cách khắc phục có khả năng nhất cho hầu hết các trường hợp như vậy là câu trả lời của @ Anirudh bên dưới.
geeky_monster

4
Tôi thấy câu trả lời này là sai lệch. Câu trả lời tốt hơn là bởi @Anirudh dưới đây.
quay

Câu trả lời dưới đây là tốt hơn, như những người khác đã đề cập.
RaneWrites

935

Trong bất kỳ một trong các trang js của bạn, bạn đang thiếu

module.exports = router;

Kiểm tra và xác minh tất cả các trang JS của bạn


1
@Anirudh Tâm cũng mô tả lý do của lỗi
sac Dahal

@Anirudh, cảm ơn nó rất hữu ích nhưng làm thế nào để xuất bộ định tuyến ở đây trong ES6? đơn giản export {router}cũng đưa ra lỗi đó
adi

3
@adi stackoverflow.com/questions/38550979/ Bạn đến đây :)
Anirudh

Đáng chú ý điều này thường ở cuối trang js của bạn
AndrewLeonardi

3
cuối cùng tôi đã bỏ lỡ một s: |
Muhammad Umer

70

Giải pháp đơn giản nếu bạn đang sử dụng express và doing

const router = express.Router();

đảm bảo

module.exports = router ;

ở cuối trang của bạn


Điều này không ghi đè lên các tài sản khác trong xuất khẩu? Tôi đang xuất nhiều.
TheRealChx101

3

Tôi đã nhận được thông báo lỗi tương tự nhưng có một vấn đề khác. Đăng bài cho những người khác bị mắc kẹt trên cùng.

Tôi chuyển các get, post, put, deletechức năng để tập tin định tuyến mới trong khi refactoring, và quên để chỉnh sửa đường dẫn. Thí dụ:

Sai:

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

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

Chính xác:

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

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

Mất một lúc để phát hiện ra, vì lỗi đã khiến tôi kiểm tra cú pháp trong đó tôi có thể đã bao bọc một đối số trong một đối tượng hoặc nơi tôi bỏ lỡ module.exports = router;


Tôi đã gặp một lỗi tương tự khi tôi tham chiếu một tuyến đường không tồn tại
NiallJG

3

kiểm tra tập tin records.js của bạn

ví dụ tuyến.js của tôi

    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)
      

kiểm tra kết thúc của Rout.js

module.exports = bộ định tuyến

nếu không có add và module.exports = bộ định tuyến chạy lại


Nếu Lỗi của bạn là: "TypeError: Route.post () hoặc Route.get () yêu cầu chức năng phần mềm trung gian nhưng có Đối tượng"

goto controller.js (ví dụ: usersControll) và kiểm tra tất cả các tên hàm bạn có thể viết sai chính tả hoặc bạn đã đưa ra trong tệp tuyến đường chức năng nhưng bị bỏ sót trong các trình điều khiển

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

trong Rout.js tôi đã đưa ra hai tuyến đường nhưng trong bộ điều khiển tôi đã bỏ lỡ để xác định tuyến đường cho

router.post ('/ người dùng / đăng nhập')

điều này sẽ gây ra lỗi **

"TypeError: route.post () yêu cầu chức năng phần mềm trung gian nhưng có Đối tượng"

**


Đó chính xác là những gì tôi đã thiếu! Báo cáo xuất khẩu !!
saibbyweb

1

Tôi đã có lỗi này và giải pháp trợ giúp được đăng bởi Anirudh. Tôi đã xây dựng một mẫu để định tuyến nhanh và quên đi sắc thái này - rất vui vì nó là một sửa chữa dễ dàng.

Tôi muốn làm rõ một chút cho câu trả lời của anh ấy về nơi đặt mã này bằng cách giải thích cấu trúc tệp của tôi.

Cấu trúc tệp điển hình của tôi như sau:

/lib

/routes

---index.js (điều khiển điều hướng chính)

/page-one



/page-two



     ---index.js

(mỗi tệp [trong trường hợp của tôi là index.js trong trang hai, mặc dù trang một cũng sẽ có index.js] - cho mỗi trang - sử dụng app.METHODhoặc router.METHODcần phải có module.exports = router;ở cuối)

Nếu ai đó muốn tôi sẽ đăng một liên kết đến mẫu github thực hiện định tuyến nhanh bằng cách sử dụng các thực tiễn tốt nhất. cho tôi biết

Cảm ơn Anirudh !!! cho câu trả lời tuyệt vời


1

Kiểm tra tất cả các tập tin của bạn:

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

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

Lưu đúng cách, trong trường hợp của tôi, một tệp bị bỏ sót và ném cùng một lỗi


0

Trong trường hợp của tôi, tôi đã không xuất khẩu mô-đun. module.exports = router;


Điều này khác với hai câu trả lời ở trên như thế nàomodule.exports = router;
Akin Okegbile

Ồ, tôi có thể thấy chúng ở phía dưới xin lỗi vì sự trùng lặp
Usama Tahir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.