NodeJS将中间件解析为Controller / Route

时间:2018-03-16 21:44:49

标签: node.js express

我现在从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

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

1 个答案:

答案 0 :(得分:0)

有几个问题。其一,如果查看express-recaptcha模块https://mywebsite的文档,则需要解析请求体以使该模块正常工作。要做到这一点,你需要你正确拥有的body-parser模块,但你还需要添加中间件:

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

您可以在app文件中定义server.js后立即添加此内容。然后,您的recaptcha文件中未定义home.js。您可以将以下定义从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)的响应。这些应添加到负责呈现和验证的特定路由中。我想如果你看一下我提供的链接,它会有所帮助。