【问题标题】:NodeJS parse middleware to Controller/RouteNodeJS 将中间件解析为 Controller/Route
【发布时间】:2018-03-16 21:44:49
【问题描述】:

我现在开始使用 NodeJS,但在使用 express 访问控制器中的某些功能时遇到问题。

例子:

我的 server.js:

var express = require('express');
var consign = require('consign');
var bodyParser = require('body-parser');
var expressValidator = require('express-validator');

var Recaptcha = require('express-recaptcha');
var recaptcha = new Recaptcha('blablabla', 'blablabla');

var app = express();

app.set('view engine', 'ejs');
app.set('views', 'app/views');
app.use(express.static('./app/public'));

consign()
        .include('./app/routes')
        .then('./app/models')
        .then('./app/controllers')
        .into(app);

module.exports = app;

app.listen(3000, function () {
    console.log('Server ON');
});

我的 app/routes/home.js 路由:

module.exports = function (myapp) {
    myapp.get('/site', recaptcha.middleware.render, function (req, res) {
        myapp.app.controllers.home.pagina(myapp, req, res, {title: 'Cadastre-se', url: req.originalUrl, captcha: res.recaptcha});
    });
};

我的 app/controllers/home.js 控制器:

module.exports.pagina = function (myapp, req, res, page) {
    res.render("index", page);
};

您正在返回错误:

ReferenceError: recaptcha is not defined at Function.module.exports (/Users/User/NodeJS_projects/myapp/app/routes/home.js:2)

如果我在 server.js 文件中调用中间件如下:

...ss.static('./app/public'));

app.use(recaptcha());

consign()...

返回以下错误:

TypeError: recaptcha is not a function

如何解决这个问题?或者,将中间件传递给控制器​​或路由的正确方法是什么?

【问题讨论】:

  • 您是否安装了“express-recaptcha”,例如运行 npm install --save express-recaptcha
  • @MattLong 已安装。如果我在 server.js 上运行直接命令,它可以工作。
  • 您希望recaptcha.middleware.renderapp/controllers/home.js 控制器中如何定义?您是否在该文件的某处导入recaptcha?如果是的话,你能分享完整的代码吗?
  • @Behrooz 这是完整的代码。我对调用 home.js 控制器中的 pagina() 函数的 home.js 路由进行了更正
  • 我会将 server.js 的第 6-7 行移到一个模块中,在该模块中将导出 recaptcha。然后你可以在你需要的地方导入它(这两个路由模块)

标签: node.js express


【解决方案1】:

有几个问题。一,如果您查看express-recaptcha 模块here 的文档,您需要解析请求正文才能使该模块工作。为此,您需要正确拥有的 body-parser 模块,但您还需要添加中间件:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

您可以在您的server.js 文件中定义app 后立即添加它。然后,您的home.js 文件中没有定义recaptcha。您可以将以下定义从server.js 移动到home.js

var Recaptcha = require('express-recaptcha');
var recaptcha = new Recaptcha('blablabla', 'blablabla');

另外,您将app.use(recaptcha()); 添加到您的server.js 文件中。 recaptcha 本身不是一个函数。它包含两个中间件函数,一个用于渲染小部件 (recaptcha.middleware.render),另一个用于验证来自小部件的响应 (recaptcha.middleware.verify)。这些应该添加到负责渲染和验证的特定路由中。我认为如果您查看我提供的链接,它会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 2014-06-23
    • 2019-01-22
    • 2015-10-13
    • 2017-01-14
    • 2012-12-15
    • 2020-01-27
    • 2019-11-10
    • 2015-07-12
    相关资源
    最近更新 更多