【问题标题】:How to use MVC and include files in my node app如何在我的节点应用程序中使用 MVC 和包含文件
【发布时间】:2017-06-26 14:38:39
【问题描述】:

我有一个 Node 应用程序,我有三个文件,并且正在尝试以 MVC 模式构建我的节点。

我想要一种方法将我的所有需求和变量放入我的 server.js 我的 routes.js 中的所有路由以及我的 控制器中的函数.js.

我的 路由器 很好,可以正常工作。 如何在我的 server 文件中包含来自 controller 的函数

我有:

  • server.js

var configure = require('./router');
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;

// get an instance of router
var router = express.Router();
configure(router);

var request = require('request');
var nodePardot = require('node-pardot');
var bodyParser = require('body-parser');
var rp = require('request-promise');

// Start the server
app.listen(port);
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({extended: true})); // support encoded bodies
console.log('Test server started! At http://localhost:' + port); // Confirms server start
//
// // START THE SERVER
// // ==============================================
app.listen(port);
console.log('Server has started!! ' + port);

// apply the routes to our application
app.use('/', router);
  • router.js`

  module.exports = function (router) {
    
            // route middleware that will happen on every request
            router.use(function (req, res, next) {
        
                // log each request to the console
                console.log(req.method, req.url);
        
                // continue doing what we were doing and go to the route
                next();
            });
        
        // home page route (http://localhost:8080)
            router.get('/', function (req, res) {
                res.send('im the home page!');
            });
    
 

    router.get('/login', function (req, res) {
                res.send('this is the login form');
            })
    
            // process the form (POST http://localhost:8080/login)
            .post('/login', function (req, res) {
                console.log('processing'); // shows on console when post is made
                res.send('processing the login form!'); // output on postman
            });
    };
  • controller.js

    var password = 'gf.09';
    var userkey = 'dfgg';
    var emailAdmin = 'rt.r@rt.co.uk';
    
    // Start the server
    app.listen(port);
    app.use(bodyParser.json()); // support json encoded bodies
    app.use(bodyParser.urlencoded({extended: true})); // support encoded bodies
    console.log('Test server started! At http://localhost:' + port); // Confirms server start
    
    var firstFunction = function () {
        return new Promise (function (resolve) {
            setTimeout(function () {
                app.post('/back-end/test', function (req, res) {
                    console.log(req.body);
                    var login = req.body.LoginEmail;
                    res.send(login);
                    resolve({
                        data_login_email: login
                    });
                });
                console.error("First done");
            }, 2000);
        });
    };
    
    var secondFunction = function () {
        return new Promise (function (resolve) {
            setTimeout(function () {
                nodePardot.PardotAPI({
                    userKey: userkey,
                    email: emailAdmin,
                    password: password,
                    DEBUG: false
                }, function (err, client) {
                    if (err) {
                        // Authentication failed
                        console.error("Authentication Failed", err);
                    } else {
                        // Authentication successful
                        var api_key = client.apiKey;
                        console.log("Authentication successful !", api_key);
                        resolve({data_api: api_key});
                    }
                });
                console.error("Second done");
            }, 2000);
        });
    };
    
    
    function thirdFunction(result) {
        return new Promise (function () {
            setTimeout(function () {
                var headers = {
                    'User-Agent': 'Super Agent/0.0.1',
                    'Content-Type': 'application/x-www-form-urlencoded'
                };
    // Configure the request
                var api = result[1].data_api;
                var login_email = result[0].data_login_email;
                var options = {
                    url: 'https://pi.pardot.com/api/prospect/version/4/do/read',
                    method: 'POST',
                    headers: headers,
                    form: {
                        'email': login_email,
                        'user_key': userkey,
                        'api_key': api
                    },
                    json: true // Automatically stringifies the body to JSON
                };
    
    // Start the request
                rp(options)
                    .then(function (parsedBody) {
                        console.error(login_email, "Is a user, login pass!");
    
                    })
                    .catch(function (err) {
                        console.error("fail no such user");
                        // res.status(400).send()
    
                    });
                console.error("Third done");
            }, 3000);
        }
        );
    }
    
    // sequence of functions
    Promise.all([firstFunction(), secondFunction()])
        .then(thirdFunction);

我的尝试

var routers = require('./router');
var controller = require('./test');
// var controller = require('./test.js','./router' );
var express = require('express');
var request = require('request');
var nodePardot = require('node-pardot');
var bodyParser = require('body-parser');
var rp = require('request-promise');
var app = express();
var port = process.env.PORT || 8080;
var router = express.Router();

routers(router);
controller(Promise);

和

module.exports = function (Promise) {  

all functions 

}

问题是某些变量对 controller.js 不可用,所以我收到如下错误:

app.post('/back-end/controller', function (req, res) {

            ^

【问题讨论】:

    标签: javascript node.js model-view-controller


    【解决方案1】:

    这很简单,使用与您在 router.js 中应用的逻辑相同的逻辑。

    在 controller.js 中使用类似下面的内容:

    exports.function_name = function(params, ...){
    . . .
    }
    

    然后通过导入controller.js来访问这些函数

    var controller = require('./controller.js');
    controller.function_name(param..)   # execute with required params and callback
    

    如果你想返回一个对象,那么你可以做 module.exports

    module.exports = Promise.all([firstFunction(), secondFunction()]) .then(thirdFunction);
    

    控制器对象现在包含一个承诺,所以

    var controller = require('./controller.js');
    

    controller 对象可以直接作为promise 使用,现在不需要调用函数了。

    一个更好的选择是从controller.js 中导出所有的函数,然后在app.js 中你可以通过promise 使用它们。

    Promise.all([controller.firstFunction(), controller.secondFunction()]) .then(controller.thirdFunction);
    

    【讨论】:

    • 我知道了,我之前尝试过这个,但无法开始工作。我会再尝试。谢谢
    • 如果您能提及您之前遇到的错误,那就太好了
    • 是的,你是对的。如果我收到错误,我会再试一次,如果不接受你的答案,我会更新答案
    • 查看编辑如果它仍然不起作用然后告诉我
    • 太好了,我会试试这个,让你知道。如果我使用module.exports = Promise.all([firstFunction(), secondFunction()]) .then(thirdFunction);,我会使用controller.(Promise.all([firstFunction(), secondFunction()]) .then(thirdFunction)) 吗?
    猜你喜欢
    • 2015-11-21
    • 2021-11-02
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2017-08-22
    • 2020-08-16
    相关资源
    最近更新 更多