代码之家  ›  专栏  ›  技术社区  ›  Jake T.

尝试模块化express时未定义响应。获取回调

  •  1
  • Jake T.  · 技术社区  · 8 年前

    我有一个express应用程序,其初始化端点与此类似(它安装在我的index.js中的/webhooks端点上,与当前设置一起使用):

    const bodyParser = require('body-parser');
    
    module.exports = function() {
    
        var app = express();
    
        app.use(bodyParser.urlencoded({extended:true}));
        app.use(bodyParser.json());
    
        app.get('/test', function(request, response) {
            //Do stuff
            response.send("success");
        });
        return app;
    }
    

    我有几个不同的get和post端点,在它们的主体中有更多的端点,所以我想让我的初始值设定项更加简洁,使这里的内容更加可读。所以我试着这样做:

    const bodyParser = require('body-parser');
    
    module.exports = function() {
        var app = express();
        app.use(bodyParser.urlencoded({extended:true}));
        app.use(bodyParser.json());
    
        app.get('/test', test(request, response));
    }
    
    function test(request, response) {
        //Do stuff
        response.send("success");
    }
    

    这样,我就可以很容易地看到我的端点列表,如果我想看到一个端点实际上在做什么,我可以去那个函数。然而,当我尝试构建我的应用程序时,我在 app.get('/test, test(request, response));

    我是错过了一些简单而明显的东西,还是这个设置不起作用?是否将所有这些函数定义都放在 app.get() 电话?

    ===编辑=======

    为了清楚起见,我使用了解析服务器和我的索引。js包括以下内容:

    var Webhooks - require('./Webhooks.js');
    app.use('/webhooks', Webhooks());
    

    对于我最初提出的问题,Webhook起作用了。我可以成功地打电话 https://myapp.com/webhooks/test 并得到响应。但是,我有几个webhook,希望保持这个文件的整洁。我首先在最初的问题中尝试了实现,但得到了 response is not defined 错误。

    然后,我尝试重组为以下内容:

    index.js:

    var WebhookController = require('./WebhookController.js');
    app.use('/webhooks', WebhookController());
    

    WebhookController.js:

    const express = require('../node_modules/express');
    const bodyParser = require('../node_modules/body-parser');
    const request = require('../node_modules/request');
    const Webhooks = require('./Webhooks.js');
    
    module.exports = function() {
        var app = express();
    
        app.use(bodyParser.urlencoded({extended:true}));
        app.use(bodyParser.json());
    
        app.get('/test', Webhooks.test(request, response));
    
        return app;
    }
    

    Webhooks.js:

    function test(request, response) {
        //Do stuff using request
        response.send("success");
    }
    
    module.exports = test;
    

    然而,在这里,当我尝试访问请求时,它会说“无法访问未定义的___of”,因此请求和响应甚至不会传递到Webhooks.test中。如果我用app。get('/test',Webhooks.test(请求,响应);'我得到相同的“响应未定义”错误。

    1 回复  |  直到 8 年前
        1
  •  1
  •   R. Gulbrandsen    8 年前

    我相信这将解决您想要的问题,而不是帮助您修复错误,这是一个JavaScript问题:请求和响应未在文件中声明,并且未定义。它用于路由的原因是因为它的中间件位于express堆栈中。

    如果您想将不同端点的逻辑拆分到不同的文件,您可以像这样轻松地完成:

    app.js

    var app = require('express')();
    
    var UserController = require('./UserController');
    app.use('/users', UserController());
    

    UserController.js

    现在,因为我们要将此路由器添加到/users端点,所以此处写入的地址将与此相对

    var app = require('express');
    var router = app.Router();
    
    module.exports = function() {
    
      router.get('/', function(req, res) { /* get all users */ }      
      router.get('/:id', function(req, res) { /* specific user */ }
    
      return router;
    }
    

    现在,如果您想将参数传递给UserController,您将在应用程序中添加参数。JSlike

    app.use('/users', UserController(argument));
    

    然后在控制器中使用它

    module.exports = function(argument) {
    

    app.js

    var app = require('express')();
    
    var UserController = require('./UserController');
    app.get('/users', UserController.getAll);
    

    UserController.js

    module.exports = {
      getAll: function(req, res) { /* get all users */ },  
      get: function(req, res) { /* specific user */ }
    }
    

    如果您希望将所有路线作为文档的一部分列在一个文件中,那么第二种方法很好。

    附言 答:如果这不是您想要的,请告诉我,我会删除答案。特别是如果我误解了你