【问题标题】:Route requiring a middleware function需要中间件功能的路由
【发布时间】:2018-05-30 07:27:55
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您是否在您发布的代码或其他地方遇到了该错误?我只看到一个.use(...),它没有被通过undefined。

标签: javascript node.js express node-modules


【解决方案1】:

在我看来,问题可能出在加载此模块的代码中,因为您从未导出实际的路由器。因此,假设您在加载此模块的调用者中执行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));

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


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

【讨论】:

  • 这是我在 index.js 中调用模块的方式 var routes = require('./routes/routes')(io);
【解决方案2】:

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

let myRouter = new Router();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2015-10-08
    • 1970-01-01
    • 2019-11-14
    • 2021-09-07
    相关资源
    最近更新 更多