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
相关产品推荐
相关产品推荐

