拆分长的 NodeJs webserver 文件

Split the long NodeJs webserver File

我的 NodeApplication 有一个很长的 webserver.js 文件,基本上它的作用是 它有一个显示静态页面的快速模块,还有一些处理 GET 和 POST 请求的函数 ..

这些 GET 和 POST 请求将在内部调用一些 REST 服务来获取数据并将结果传递给浏览器,因此 REST API 不会暴露给 public ..

    var express = require('express');
    var request = require('request');
    var compression = require('compression');
    var bodyParser = require('body-parser');
    var app = express();
    var util = require("util");
    async = require("async");



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


    require('./node_scripts/session.js')(app);
    var Url = require('./node_scripts/ServiceUrls.js');


    //REDIRECT TO PUBLIC DIRECTORY
    app.use('/', express.static(__dirname + '/public'));


    //GET TEMPLATES FOR FORM
    app.get('/Templates', function(req, res) {
        var MyJsonData = {
            AccessToken: req.session.AccessToken || 0
        };
        console.log(MyJsonData);
        request({
            url: Url.UserService + 'GetTemplates', //URL to hit
            method: 'POST',
            json: MyJsonData

        }, function(error, response, body) {
            if (error) {

                res.send("dummytext");
                res.end();
                console.log("/Templates (send dummy data) ->" + error);
            } else {
                console.log("/Templates REST Response");
                console.log(response.statusCode, body);
                res.send(body);
                res.end();
            }


        })
    });

app.get('/AnotherRequest', function(req, res) {
        });
..
..
..
app.get('/AnotherNthRequest', function(req, res) {
        });

那么如何拆分文件,以便可以将一些请求分组到单独的js文件中,这样开发起来会更容易

我是 NodejS 的新手。是的,但我的经验是 PHP 在这种情况下对我没有帮助

我们可以利用express实例(var app),记住express支持以下对应HTTP方法的路由方法:get, post, put, head, delete等。这意味着什么我们可以将 express 实例作为参数传递给为我们处理路由的函数。

我们还可以通过将我们的回调与我们的 HTTP 方法分开来进一步扩展这个概念(记住路由的格式为 app.VERB('path', callback)),因此我们还将我们的回调放在单独的文件。

我们可以使用 exports.CALLBACKNAME 来公开各个回调,并 module.exports 将我们的完整路由文件公开给服务器模块。因此:

//templates.controller.js (this is the file name for example)

exports.tempHandler = function(req, res) {
    var MyJsonData = {
        AccessToken: req.session.AccessToken || 0
    };
    console.log(MyJsonData);
    request({
        url: Url.UserService + 'GetTemplates', //URL to hit
        method: 'POST',
        json: MyJsonData

    }, function(error, response, body) {
        if (error) {

            res.send("dummytext");
            res.end();
            console.log("/Templates (send dummy data) ->" + error);
        } else {
            console.log("/Templates REST Response");
            console.log(response.statusCode, body);
            res.send(body);
            res.end();
        }


    })
};

template.router.js

// we first export the file which houses our callbacks
var templates = require('../controllers/template.controller.js');

// the app parameter represents the express instance (var app)
// we provide it as a parameter and manipulate it in the file

module.exports = function(app) {
    // Here you go, short and clean
    app.get('/Templates', templates.tempHandler);
    // and your other routes
};

然后在 webserver.js 中,您只需添加以下行来代替您的路线:

require('./app/routes/template.router')(app);

这只是一个基本示例,希望对您有所帮助。

您可以使用 express 路由器 来达到这个目的。

下面的代码简单演示了如何修改您的代码。

您的主文件分为三个部分


  1. server.js(仅文件名,使用您的约定)

 var express = require('express');
 var bodyParser = require('body-parser');
 var app = express();

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

 //REDIRECT TO PUBLIC DIRECTORY
 app.use('/', express.static(__dirname + '/public'));

 // Send request to the routes
var router = require('./routes')(app, express);

// Append the router 
app.use('/', router);

将您的路由处理放在此处。

  1. routes.js

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


module.exports = function (app, express) {

    // Create route handlers
    var router = express.Router();

    router.route('/Templates')
        //GET TEMPLATES FOR FORM
        .get(function (req, res) {
            myController.myFunction(req,res);
        });

    router.route('/AnotherRequest')
        .get(function (req, res) {});

    ..
    ..
    ..

    router.route('/AnotherNthRequest')
        .get(function (req, res) {});

    return router;
};

把你的逻辑放在这里。

  1. controller.js

 var request = require('request');


 var Url = require('./node_scripts/ServiceUrls.js');

 exports.myFunction = function (req, res) {

     var MyJsonData = {
         AccessToken: req.session.AccessToken || 0
     };
     console.log(MyJsonData);
     request({
         url: Url.UserService + 'GetTemplates', //URL to hit
         method: 'POST',
         json: MyJsonData

     }, function (error, response, body) {
         if (error) {

             res.send("dummytext");
             res.end();
             console.log("/Templates (send dummy data) ->" + error);
         } else {
             console.log("/Templates REST Response");
             console.log(response.statusCode, body);
             res.send(body);
             res.end();
         }


     })


 };