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

Node.js+Socket.io路由模块报错:Router.use()需中间件函数却得undefined

TypeError: Router.use() requires a middleware function but got undefined - 问题分析与解决

问题场景

你正在用Socket.io开发Node.js路由模块,编写的代码如下:

var express = require("express"); // call express
var taskSchema = require("../models/taskModel");
var mongoose = require("mongoose");
var router = express.Router(); // get an instance of the express Router

module.exports = function (io) {
  router.use(function (req, res, next) {
    io.sockets.emit('payload');
    console.log("Something is happening.");
    next();
  });

  router
    .route("/tasks")
    .post(function (req, res, next) { ... });

  router
    .route("/tasks")
    .get(function (req, res) { ... });
};

启动服务器时遇到错误:

TypeError: Router.use() requires a middleware function but got a undefined

错误原因

核心问题出在路由模块的导出逻辑上:你当前导出的是一个接受io参数的函数,但这个函数没有返回router实例。当你在主服务器文件里尝试用app.use()引入这个路由时,函数执行后没有返回值(默认返回undefined),而Router.use()/app.use()要求传入的必须是合法的中间件或路由对象,自然就抛出了这个错误。

解决方法

修改导出的函数,让它在配置完路由后返回router对象,这样主文件就能拿到有效的路由实例了。

修改后的代码:

var express = require("express"); // call express
var taskSchema = require("../models/taskModel");
var mongoose = require("mongoose");
var router = express.Router(); // get an instance of the express Router

module.exports = function (io) {
  router.use(function (req, res, next) {
    io.sockets.emit('payload');
    console.log("Something is happening.");
    next();
  });

  router
    .route("/tasks")
    .post(function (req, res, next) { 
      // 你的POST逻辑代码
    });

  router
    .route("/tasks")
    .get(function (req, res) { 
      // 你的GET逻辑代码
    });

  // 关键:返回配置好的router实例
  return router;
};

主文件的正确引入方式

在你的服务器主文件(比如app.js)中,需要这样传入io并使用路由:

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 引入路由模块时传入io,拿到返回的router实例
const taskRoutes = require('./routes/你的路由文件名')(io);
// 挂载路由到指定路径
app.use('/api', taskRoutes);

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

这样就能解决这个错误,同时正常在路由中使用Socket.io的io实例了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:04:35