代码之家  ›  专栏  ›  技术社区  ›  Hamza Haddad

需要中间件功能的路由

  •  0
  • Hamza Haddad  · 技术社区  · 6 年前

    我用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
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   jfriend00    6 年前

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

    我猜您可以通过从导出的功能返回路由器来解决这个问题:

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

    然后函数将返回 路由器。使用() 会很高兴的。您可以将中间件或路由器传递给 .use() .


    如果这个猜测不完全符合目标,那么请向我们展示加载和调用这个模块的代码。

        2
  •  0
  •   Eddie D    6 年前

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

    let myRouter = new Router();
    
    Router.use('something', middlewareFunction, someotherprocess);