需要中间件功能的路由

Route requiring a middleware function

我正在使用 socket.io

在 nodejs 中创建我的路由模块
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

当调用该函数时,它将 return 等同于未定义。此外,通常在端点之前定义路由。它的结构通常如下:

let myRouter = new Router();

Router.use('something', middlewareFunction, someotherprocess);

在我看来,问题可能出在加载此模块的代码中,因为您从未导出实际的路由器。因此,假设您在加载此模块的调用者中执行 app.use()router.use(),您不会 return 从您的函数中访问路由器,因此无法挂钩该路由器,您会得到你看到的错误。

我猜你可以通过 return 从导出的函数中访问路由器来解决这个问题:

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) {
            ...
        });
    return router;            // <===========  Add this
};

然后,当你这样做时:

let m = require('yourModule');
router.use(m(io));

然后函数将 return router.use() 满意的路由器。您可以将中间件或路由器传递给 .use().


如果这个猜测不太准确,请向我们展示加载和调用此模块的代码。