尝试模块化 express.get 回调时未定义响应

response is not defined when trying to modularize out express.get callback

我有一个使用与此类似的端点初始化的 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));

处收到错误 "response is not defined"

我是不是遗漏了一些简单明了的东西,还是这个设置不起作用?我是否坚持将所有这些函数定义放在 app.get() 调用中?

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

为清楚起见,我使用的是解析服务器,我的 index.js 包括以下内容:

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

对于我最初提出的问题,webhooks 有效。我可以成功调用 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;

然而,当我尝试访问请求时,它显示 "Can't access ____ of undefined",因此请求和响应甚至没有传递到 Webhooks.test。如果我做 `app.get('/test', Webhooks.test(request, response);' 我得到同样的 "response is not defined" 错误。

我相信这将解决您正在寻找的问题,而不是帮助您修复错误,这是一个 JavaScript 问题:请求和响应尚未在文件中声明并且未定义。它对路由起作用的原因是因为它在快速堆栈中的中间件。

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

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,您将在 app.js 中添加参数,例如

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 */ }
}

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

PS:如果这不是您要查找的内容,请告诉我,我会删除答案。特别是如果我误解了你