需要中间件功能的路由

时间:2018-05-29 23:05:08

标签: javascript node.js express node-modules

我正在使用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 个答案:

答案 0 :(得分: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()

如果这个猜测没有完全达到目标,那么请向我们展示加载并调用此模块的代码。

答案 1 :(得分:0)

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

let myRouter = new Router();

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