在Express JS应用程序中全局需要模块,并在HTTP请求后使用路由器级中间件

时间:2014-12-20 13:27:39

标签: node.js express

贝娄是"用户"我的nodeJS应用程序的模块。

/**
 *  record.js
 */

var express = require('express'),
    router = express.Router();

// Config.
var config = require('../config/config');

// Validator class.
var validator = require('validator');

// User module.
var User = require('../models/user');

// Error middleware.
var errors = require('../middleware/errors');

/**
 *  --- Crypto. -------------------------------------------
 */

var crypto = require('crypto'),
    key = config.secretKey;

var encrypt = function (data) {
    var cipher = crypto.createCipher('aes-256-cbc', key);
    var crypted = cipher.update(data, 'utf8', 'base64');
    crypted += cipher.final('base64');
    return crypted;
};

var decrypt = function (data) {
    var decipher = crypto.createDecipher('aes-256-cbc', key);
    var decrypted = decipher.update(data, 'base64', 'utf8');
    decrypted += decipher.final('utf-8');
    return decrypted;
};

/**
 *  --- Register user. ----------------------------------------
 */

router.post('/user', function (req, res, next) {

    var email = validator.toString(req.body.email),
        password = validator.toString(req.body.password);

    if (!validator.isEmail(email)) {
        res.locals.validationError = 'isEmail';
        return next();
    }

    if (!validator.isLength(password, 3, 20)) {
        res.locals.validationError = {
            'type': 'isLength',
            'minLength': 3,
            'maxLength': 20
        };
        return next();
    }

    // Generate a hash, from the passowrd.
    var hash = encrypt(password);

    User.create({
        email: req.body.email,
        password: hash
    }, function (err, user) {

        if (err) {
            res.locals.dbError = err;
            return next();
        }

        // Prevent exposing sensitive data.
        var data = {
            'id': user._id,
            'email': user.email
        };

        // HTTP 201 - Created.
        return res.status(201).send(data);
    });
}, errors);

module.exports = router;

我相信最佳做法,这会让我产生以下问题。

  1. 正如您所看到的,我使用依赖注入来要求其他几个模块,其中包括" router"需要。 (配置,验证器等)。
  2. 我基本上需要在应用的每个部分都需要**验证器模块,我想知道我是否可以在全球范围内要求它并在我需要的地方引用它。**

    基本上,是否需要一个模块应用程序的不同模块?

    1. 我使用"错误"中间件,你可以在POST请求后看到它在行动中。 如果我在这个模块中有多个HTTP请求,有没有办法告诉express在每个HTTP请求之后从一个地方使用中间件?
    2. 类似下面的内容,只是我希望中间件在请求之后执行,而不是之前:

      app.all('*', errors)
      

      中间件之前没有执行过。

      1. 您如何看待模块的编码风格?你会如何重构它?你会改变什么?我刚刚学习NodeJS,这是我的第一个服务器端API,我希望养成良好的习惯。

1 个答案:

答案 0 :(得分:0)

  

我基本上需要在应用程序的每个部分都要求验证器模块,我想知道我是否可以在全球范围内要求它并在我需要的地方引用它。

是的,你可以global.validator = require('validator');。但是,这不是最佳做法,这是最糟糕的做法。显式依赖声明的节点实践受到青睐,因为它更易于阅读,在重构期间更容易跟踪,并且在出现问题时更早失败。我们有大量的浏览器代码作为证据表明将项目拆分为模块文件会使事情变得更好,并且声明每个模块的依赖关系会使事情变得更好,因此不要回归到单个连接文件的旧浏览器样式将依赖关系作为全局变量。

  

我使用"错误"中间件,你可以在POST请求后看到它在行动中。如果我在这个模块中有多个HTTP请求,有没有办法可以通知Express在每个HTTP请求后从一个地方使用中间件?

express有一个内置的错误处理中间件模式,你应该阅读并使用而不是你已经构建的这个临时方案。要使用它,请将错误传递给next

if (err) {
  return next(err);
}

将您的error中间件编码为主要路由后添加的4参数中间件:

app.use(function error(err, req, res, next) {...});