尝试模块化 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:如果这不是您要查找的内容,请告诉我,我会删除答案。特别是如果我误解了你
我有一个使用与此类似的端点初始化的 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()
调用中?
======= 编辑 =======
为清楚起见,我使用的是解析服务器,我的 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:如果这不是您要查找的内容,请告诉我,我会删除答案。特别是如果我误解了你