我已经阅读了十二因子应用程序的配置-第三部分,并在NodeJS中搜索了一种方法。似乎大多数人推荐dotenv将配置存储在环境变量中。
但是,dotenv似乎与“十二要素应用程序”相矛盾,因为:
另一种配置方法是使用未检入版本控制的配置文件,例如Rails中的config / database.yml。与使用已检查到代码存储库中的常量相比,这是一个巨大的改进,但仍然存在缺陷:容易将配置文件错误地检入存储库中;有一种趋势是配置文件分散在不同的位置和不同的格式,这使得很难在一处查看和管理所有配置。此外,这些格式倾向于特定于语言或框架。
十二因子应用程序将配置存储在环境变量中(通常缩写为env vars或env)。Env var易于在部署之间进行更改,而无需更改任何代码。与配置文件不同,它们很少有可能被意外检入代码存储库;与自定义配置文件或其他配置机制(例如Java系统属性)不同,它们是与语言和操作系统无关的标准。
理解此语句后,似乎可以使用dotenv创建一个配置文件.env,然后将其导出为环境变量。
由于.env文件可能会意外地签入代码存储库,因此这不会违反十二要素应用程序吗?
我正在尝试构建一个非常简单的购物应用程序,用户可以在其中使用虚拟货币购买商品。
我为此使用了多个NodeJS进程,因此我担心事情的异步部分。
这是我的工作:
app.post('/buy', function(req, res){
User.findOne({_id: req.userId}, function(err, user){
if(user.balance >= ITEM_PRICE){
User.decrementBalance({_id: req.userId}, function(err){
//Do transaction, give item to user, etc
});
} else {
//Not enough money
}
});
});
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,用户可以在很短的时间内提交多个购买请求。这可能会导致出现争用情况,在这种情况下,第二个请求会在第一个请求减少余额之前检查用户的余额。这导致用户具有负值,并且拿出比其余额所允许的更多的物品。
有办法解决吗?我正在考虑做一个User.update()并验证用户是否被修改。那行得通吗?