You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导出Express Router时同时导出其他对象报错,如何解决?

问题:导出Express Router时同时导出其他对象报错 "TypeError: Router.use() requires a middleware function but got a Object"

我在导出Express Router的同时导出其他对象时触发了这个错误,单独导出Router时一切正常,只要和其他对象一起导出就会报错。以下是我的代码:

const express = require('express');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const session = require('express-session');
const User = require('../models/User');

var curr_user = ""

const articles = [{
  title: 'Test articles 1',
  createdAt: Date.now(),
  description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum tincidunt, mauris in pulvinar interdum, neque justo malesuada nulla, nec vestibulum nisi nulla vel sapien. Proin mollis nulla sed urna placerat, in pharetra felis ultrices. Donec vel semper turpis. Nulla facilisi. Suspendisse posuere scelerisque lacus, at blandit tellus porta vel. Fusce sed lacus finibus, posuere felis eget, bibendum felis.'

}, {
  title: 'Test articles 2',
  createdAt: Date.now(),
  description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum tincidunt, mauris in pulvinar interdum, neque justo malesuada nulla, nec vestibulum nisi nulla vel sapien. Proin mollis nulla sed urna placerat, in pharetra felis ultrices. Donec vel semper turpis. Nulla facilisi. Suspendisse posuere scelerisque lacus, at blandit tellus porta vel. Fusce sed lacus finibus, posuere felis eget, bibendum felis ncidunt, mauris in pulvinar interdum, neque justo malesuada nulla, nec vestibulum nisi nulla vel sapien. Proin mollis nulla sed urna placerat, in pharetra felis ultrices. Donec vel semper turpis. Nulla facilisi. Suspendisse posuere scelerisque lacus, at blandit tellus porta vel. Fusce sed lacus finibus, posuere felis eget, bibend.'

}, {
  title: 'Test articles 3',
  createdAt: Date.now(),
  description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum tincidunt, mauris in pulvinar interdum, neque justo malesuada nulla, nec vestibulum nisi nulla vel sapien. Proin mollis nulla sed urna placerat, in pharetra felis ultrices. Donec vel semper turpis. Nulla facilisi. Suspendisse posuere scelerisque lacus, at blandit tellus porta vel. Fusce sed lacus finibus, posuere felis eget, bibendum felis.'

}]

const router = express.Router();

// Configure middleware
router.use(express.urlencoded({ extended: false }));
router.use(
  session({
    secret: 'mysecret', // Set a secret key for session encryption
    resave: false,
    saveUninitialized: true
  })
);

// Define routes
const requireAuth = (req, res, next) => {
  if (req.session && req.session.authenticated) {
    console.log(`sessions is ${curr_user}`)
    next();
  } else {
    res.redirect('/register/login');
  }
};

router.get('/posts', requireAuth, (req, res) => {
  res.render('articles/index', { articles: articles });
});

router.get('/login', (req, res) => {
  res.render('login');
});

router.post('/login', async (req, res) => {
  try {
    const user = await User.findOne({ email: req.body.email });
    console.log(`user is ${user}`)
    if (user && (await bcrypt.compare(req.body.password, user.password))) {
      req.session.authenticated = true;
      curr_user = user.name
      res.redirect('/register/posts');
    } else {
      res.redirect('/register/login');
    }
  } catch (error) {
    console.log(error);
    res.redirect('/register/posts');
  }
});

router.get('/signup', (req, res) => {
  res.render('signup');
});

router.post('/signup', async (req, res) => {
  const hashedPassword = await bcrypt.hash(req.body.password, 10);
  const user = new User({
    name: req.body.name,
    email: req.body.email,
    password: hashedPassword
  });
  user.save(function (err) {
    if (err) {
      console.log(err);
      res.redirect('/register/signup');
    } else {
      res.redirect('/register/login');
    }
  });
});

module.exports = { router, articles };

我试过找第三方库解决,但没用。


解决方案

错误原因

你现在是把Router和articles打包成一个对象导出,但在主文件里应该是直接把这个导出的对象传给了app.use()——而app.use()只接受中间件函数(也就是Router实例),不接受普通对象,所以才会抛出这个类型错误。

两种解决办法

方法1:Router默认导出,其他对象命名导出

修改你的导出代码:

// 先把Router设为默认导出
module.exports = router;
// 再把articles挂到导出对象上
module.exports.articles = articles;

然后在主文件里这样用:

const registerRouter = require('./你的路由文件路径');
// 正常挂载Router
app.use('/register', registerRouter);
// 要拿articles的话单独解构
const { articles } = require('./你的路由文件路径');

方法2:保持对象导出,主文件解构出Router

如果不想改导出方式,就在主文件里把Router从导出对象里解构出来再挂载:

const { router: registerRouter, articles } = require('./你的路由文件路径');
// 只把Router传给app.use()
app.use('/register', registerRouter);

额外提醒

你的路由文件里直接用router.use(session(...))其实不太合理,session中间件一般应该在主App层面挂载,这样所有路由都能共享session,也避免重复配置。


内容的提问来源于stack exchange,提问作者eddywilliams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:27:24