【问题标题】:Node JS App Better design and seperationNode JS App 更好的设计和分离
【发布时间】:2015-10-31 18:30:04
【问题描述】:

我已经使用 express 创建了一个节点应用程序。我尝试分离以下层,这将使我能够通过单元测试来测试应用程序...

问题是我不知道如何调用 router.js 文件,该文件将在 post/get/delete 应用程序中停止。

server.js 文件如下所示

http = require('http'),
app = require('./app')(),
http.createServer(app).listen(app.get('port'), function (err) {
    console.log('Express server listening on port ' + app.get('port'));
});

这是 app.js 文件

var express = require('express'),
logger = require('morgan'),
bodyParser = require('body-parser'),
routesApp = require('./ro/route');

module.exports = function () {
    var app = express();
    app.set('port', process.env.PORT || 3005);

    app.use(logger('dev'));
    app.use(function (req, res, next) {
        res.set('APP', 'User app');
        next();
    });
    app.use(bodyParser.json());
    app.use(routesApp);
    return app;
};

这是router.js,它将根据http类型如post/delete/get等将调用路由到其他模块...

var handleGet = require('../controller/handleGet');
var handlePost = require('../controller/handlePost');
var express = require('express');

    module.exports = function (app) {

        var appRoute = express.Router();
        app.use(appRoute);
        appRoute.route('*')
            .post(function (req, res) {
                handlePost(req, res);
            })
            .get(function (req, res) {
                handleGet(req, res)
            })

目前我有两个问题:

  1. 如何使它在调试时运行它转储 app.use(appRoute); 在 router.js 文件上? 错误是 TypeError: undefined is not a function

  2. 是不是像我的帖子中那样构建节点应用程序的好方法?我想像 SOC 一样分离所有这些层,我对 node 和 express 还很陌生,我尝试将其构建为模块化和可测试的......

【问题讨论】:

  • Speration = 分离?

标签: javascript node.js design-patterns express mocha.js


【解决方案1】:
  1. 如何使它在调试时工作它转储在 router.js 文件的app.use(appRoute); 中?错误是TypeError: undefined is not a function

这失败了,因为当你在 app.jsrequire 时你没有将 app 传递到模块中,你需要做类似的事情

app.use(routesApp(app)); // <- this hurts my eyes :(
  1. 是像我的帖子中那样构建节点应用程序的好方法吗?我想像 SOC 一样拆分所有这些 leyrs,我对节点和表达还很陌生,我尝试将其构建为模块化和可测试的...李>

您肯定走在正确的轨道上,将事物分开通常总是一个好主意。测试绝对是一大优势,但它也有助于其他方面,例如可维护性和调试。

就个人而言,我会使用bin 目录进行任何启动脚本配置

bin/www

var app = require('./app');
app.set('port', process.env.PORT || 3005);
var server = app.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + app.get('port'));
});

这将有助于将您的 express 应用与所有环境设置分离。这应该让您的app.js 保持干净,并且只包含与应用相关的配置

app.js

var express = require('express')
  , app = express()
  , logger = require('morgan')
  , bodyParser = require('body-parser')
  , routes = require('./routes.js');

app.use(logger('dev'));
app.use(function (req, res, next) {
    res.set('APP', 'User app');
    next();
});
app.use(bodyParser.json());
app.use('/', routes);
...
module.exports = app;

最后,您的routes.js 应该只处理您的网址

routes.js

var express = require('express')
  , router = express.Router()
  , handleGet = require('../controller/handleGet')
  , handlePost = require('../controller/handlePost');

router.get('/', handleGet);
router.post('/', handlePost);
...
module.exports = router;

【讨论】:

  • 谢谢詹姆斯! 1+,如何将请求响应传递给post并从路由器获取模块? 2.在server.js中我定义了http server,我不需要?
  • @JohnJerrby 我的示例已经演示了您如何处理来自路由器的get/post 响应?不,express 已经在幕后完成了所有这些工作(再次参见示例)。
  • 谢谢,但我把函数放在了 handlePost(req, res)) 之后,我得到错误 req is not defined...我需要将它传递给 handlePost 和 handleGet..
  • @JohnJerrby 任何具有function name(req, res) { ... } 签名的函数都可以作为快速路由的处理程序传递。如果您放入自定义处理程序,即get('/', function(req, res) { handleGet(req, res); }),我想这可行吗?
  • 好的,它不起作用,您能否更新帖子如何传递此参数,因为也许我错过了一些东西......谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多