贝娄是"用户"我的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;
我相信最佳做法,这会让我产生以下问题。
我基本上需要在应用的每个部分都需要**验证器模块,我想知道我是否可以在全球范围内要求它并在我需要的地方引用它。**
基本上,是否需要一个模块应用程序的不同模块?
类似下面的内容,只是我希望中间件在请求之后执行,而不是之前:
app.all('*', errors)
中间件之前没有执行过。
答案 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) {...});