0

介紹設置爲一個節點應用

正確的結構到目前爲止,我有三個文件,一個test.js是我已經建立了合作三大功能的文件。

但現在我正在嘗試使用MVC或至少某種模式的結構。所以,現在我router.jsapp.js

問題

我應該把我的諾言功能從test.jsconfig.jsserver.js或別的東西,我只是在人們將如何做到這一點興趣,什麼結構的正確方法的NodeJS。

  1. 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); 

app.listen(port); 
console.log('Server has started!! ' + port); 

// apply the routes to our application 
app.use('/', router); 
  • config.js
  • 在她e口建立我路由

    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!'); 
        }); 
    
    // sample route with a route the way we're used to seeing it 
        router.get('/sample', function (req, res) { 
         res.send('this is a sample!'); 
        }); 
    
    
    // about page route (http://localhost:8080/about) 
        router.get('/about', function (req, res) { 
         res.send('im the about page!'); 
        }); 
    
    // route middleware to validate :name 
        router.param('name', function (req, res, next, name) { 
         // do validation on name here 
         console.log('doing name validations on ' + name); 
    
         // once validation is done save the new item in the req 
         req.name = name; 
         // go to the next thing 
         next(); 
        }); 
    
    // route with parameters (http://localhost:8080/hello/:name) 
        router.get('/hello/:name', function (req, res) { 
         res.send('hello ' + req.params.name + '!'); 
        }) 
    
        // app.route('/login') 
    
        // show the form (GET http://localhost:8080/login) 
         .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 
         }); 
    }; 
    
  • test.js
  • 在這裏是那些承諾獲取數據和API鍵的鏈的功能列表

    (小功能之外,許多的一個饋入每過)

    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); 
        }); 
    }; 
    
    +1

    其實你的config.js根本不是configs,而是路由。所以稱它們爲routes.js並直接將express.Router導入到router.js而不是傳遞它。 – jstice4all

    +0

    加1爲知識,謝謝 – Beep

    +0

    更好地使用這種方法從官方文檔https://expressjs.com/zh/guide/routing.html#express-router – jstice4all

    回答

    2

    我推薦的結構是把一切都只是server.jslib目錄中,以便所有的應用程序是lib/server.js - 一切是package.json,在node_modules依賴(上npm install創建,而不是在回購),.gitignore,配置文件特拉維斯, Circle,Heroku或任何你正在使用的服務,一些README.md和類似的東西。現在

    server.js只是最低限度的要求lib/app

    const app = require('./lib/app'); 
    

    並且用類似啓動服務器:

    const server = app.listen(app.get('port'),() => { 
        logger.info('%s listening on port %s', app.get('name'), app.get('port')); 
    }); 
    server.on('error', (err) => { 
        logger.error(err.message || err); 
        process.exit(1); 
    }); 
    

    其中logger是一些高槓杆記錄器像溫斯頓或類似的東西。

    就是這樣。現在,lib/app.js是加載中間件的最小代碼,比如body parser等。,造成快件應用程序,並設置變量,提供端口名稱,然後使用由lib/routes出口路由器:

    const routes = require('./routes'); 
    // ... 
    app.use('/', routes); 
    

    lib/app應該足夠用來與像supertest工具進行測試,但它不聽在任何端口上 - server.js。這對簡化測試很重要。

    通過lib/routes出口路由器用於一切,你可以用一個lib/routes.js文件開始,然後根據需要轉換爲lib/routes/index.js加上幾個文件中lib/routes

    這些路由只定義了實際的路由和輸入驗證,使用一個模塊(例如, express-validation和由lib/controllers導出的註冊控制器 - 可以以lib/controllers.js開頭,並根據需要轉換爲lib/controllers/index.jslib/controllers/*.js - 就像路由一樣。

    然後,我會添加頂級spectesttests目錄,其中所有的測試都會執行。測試可能要求您的lib/app在其上運行測試,而不需要偵聽實際的TCP端口 - 這些端口將使用實際控制器測試您的路由。其他測試需要lib/util並對您的實用程序運行一些單元測試等。確保使用istanbulnyc等工具來計算測試覆蓋率。

    數據庫架構和數據模型會去lib/schemaslib/models,一些實用的助手在lib/util,一些配置加載代碼lib/config

    這是非常靈活的佈局和工作得很好。你可以只用幾個文件開始:

    README.md 
    LICENSE.md 
    package.json 
    server.js 
    lib/app.js 
    lib/routes.js 
    lib/controllers.js 
    lib/config.js 
    

    等,並很容易地根據需要轉換所有xxx.js文件到xxx/index.js與小xxx/*.js文件整個文件夾。

    與您的方法的主要區別在於,我建議導出路由器,並使用高層路由器使用它們,而不是將高級路由器傳遞到較低的控制桿模塊,以便導出需要路由器處理的功能。

    所以不是:

    const moreSpecific = require('more-specific'); 
    const moreGeneral = express.Router(); 
    moreSpecific(moreGeneral); 
    

    ,然後在更具體:

    module exports = (router) => { 
        router.use('/abc/xyz', ...); 
    }; 
    

    我會建議如出口在文件中的更具體的路由器routes/abc.js

    const router = express.Router(); 
    router.use('/xyz', ...); 
    module exports = router; 
    

    然後在更一般的路由器例如,在routes/index.js

    const abc = require('abc'); 
    const router = express.Router(); 
    router.use('/abc', abc); 
    // and export the main router for other modules like app.js to use: 
    module.exports = router; 
    

    有像/abc/xyz的路線。

    +0

    好的答案! ,正確的即時通讀這一點,一旦我回到你身邊。謝謝,我仍然試圖改變我的應用程序與這種結構一旦工作,一旦我得到這個工作不好接受。我可以看到這是多麼可擴展,並有增加+1的空間 – Beep

    相關問題