【问题标题】:Express & Node.js Exception: 500 TypeError: fn is not a functionExpress & Node.js 异常:500 TypeError:fn 不是函数
【发布时间】:2016-09-13 22:10:33
【问题描述】:

我使用 Express 创建了一个 Node.js 项目,并在使用自定义路由时遇到了这个异常。

500 类型错误:fn 不是函数 在回调(/WallaceBot/WallaceBot/node_modules/express/lib/router/index.js:272:11) 在参数 (/WallaceBot/WallaceBot/node_modules/express/lib/router/index.js:246:11) 通过时(/WallaceBot/WallaceBot/node_modules/express/lib/router/index.js:253:5) 在 Router._dispatch (/WallaceBot/WallaceBot/node_modules/express/lib/router/index.js:280:5) 在 Object.Router.middleware [作为句柄] (/WallaceBot/WallaceBot/node_modules/express/lib/router/index.js:45:10) 在下一个(/WallaceBot/WallaceBot/node_modules/express/node_modules/connect/lib/http.js:204:15) 在 Object.methodOverride [作为句柄] (/WallaceBot/WallaceBot/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:35:5) 在下一个(/WallaceBot/WallaceBot/node_modules/express/node_modules/connect/lib/http.js:204:15) 在 Object.bodyParser [作为句柄] (/WallaceBot/WallaceBot/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:88:61) 在下一个(/WallaceBot/WallaceBot/node_modules/express/node_modules/connect/lib/http.js:204:15)

我在 app.js 中声明路由

var webhook = require('./routes/webhook.js');
app.get('/', routes.index);
app.get('/webhook', webhook);

在我的 webhook.js 中,

/*
 * GET Webhook.
 */

exports.webhook = function(req, res){
  res.render('index', { title: 'Webhook' })
};

不过,我用另一种方式在 app.js 中声明路由,比如

app.get('/webhook', function(req, res){
  res.render('index', { title: 'Webhook' })
});

我没有得到那个例外。

有人知道为什么吗?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    var webhook 看起来像这样:

    {
      "webhook" : function(req, res) { ... }
    }
    

    所以您的路由处理程序设置如下所示:

    app.get('/webhook', {
      "webhook" : function(req, res) { ... }
    });
    

    这是无效的,因为 Express 需要一个函数参数,而不是一个对象。

    相反,您想使用导出模块对象的webhook 属性:

    var webhook = require('./routes/webhook.js').webhook;
    

    【讨论】:

    • 谢谢罗伯特,这看起来像是一个愚蠢的语法错误。但是你知道调试node.js的好方法吗,比如有个断点,看看局部变量的值?
    • @HaichenLiu 你可以试试node-inspector,根据我的经验,它的效果很好。
    【解决方案2】:

    作为其他答案的替代解决方案,您可以将 webhook.js 文件更改为如下所示:

    /*
     * GET Webhook.
     */
    
    exports = module.exports = function(req, res){
      res.render('index', { title: 'Webhook' })
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 2020-06-21
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多