Node JS静态字符串映射器的最佳实践

时间:2014-08-02 08:34:59

标签: node.js express sails.js

我正在运行一个Node JS应用程序(Sails JS,但不应该这么重要)和MongoDB(也不重要)。

我有一个数据库模型,WebApp可以保存它的许多实例。为简单起见,让我们采用一个 UserActivityHistory 模型示例(该示例不是我的真实案例,因此不要理解逻辑)。

该模型的其中一个成员是" ActivityType" ,它可以是中长文本,但可以从静态集中选择。例如:

  • ActivityType可能是以下之一:
    1. "用户添加了新帐户"。
    2. "用户更改了帐户密码"。

因此,假设我要保存数千个实例,我更喜欢保存活动类型标识符/代码以获得内存性能。例如:

而不是保存"用户添加了新帐户", WebApp应该保存" UANC"

当用户想要查看" UserActivityHistory"时,我想要一个静态映射器(可能是全局变量?),它是某种字典,如下所示:

  • [" UNAC"] ="用户添加了新帐户"
  • [" UCAP"] ="用户更改了帐户密码"

这意味着,我收到活动的代码并从运行应用程序的服务器内存中保存的静态字典中返回文本。

实现此映射的最有效方法和最佳做法是什么?

我想到的方式:

1)全局变量:保存全局字典并通过API调用添加/删除值。我不确定这是否是一个明智的想法,我仍然不明白为什么不这样做,但我内心深处还有一些事情告诉我不要相信全局变量。

2)将映射器保存在另一个数据库中:这需要为每组活动再次调用数据库。 (如果我一次加载很多活动,对我来说似乎并不那么重,但仍然可以有更好的解决方案)。

  • 请注意,我想添加动态活动,因此使用带开关案例的功能不是一个合适的解决方案。

1 个答案:

答案 0 :(得分:1)

如果您希望每次更改字符串时都不必重新部署应用程序,那么我建议您查看从某些持久存储中提取这些内容(例如外部文件/数据库)。

无论您选择哪种,因为它们是应用程序设置,您可以在应用程序启动或首次访问时将其拉出一次。这可以让您灵活地将它们更改为应用程序(或者甚至是来自应用程序)。


回答你的意见

  

如果我在应用程序首次访问时启动它们,我应该在哪里保存它们?全局变量?

在这里做的自然事情就是将它作为自己的模块,这将为你提供一个操作列表的其他方法的好地方。坚持储存。如果你采用单例方法,那么你可以在第一次访问时加载资源,例如

<强> ActivityType.js

var fs = require('fs');
var cache = null;
function loadCache(callback) {
    if (!cache) {
        fs.readFile('/path-to-strings', function (err, data) {
            if (!err) {
                // for the purpose of the example, lets assume you are storing the 
                // strings as a JSON object e.g. { 'key1': 'value1', 'key2': 'value2' }
                cache = JSON.parse(data);
                callback(null, cache);
            } else {
                callback(err, null);
            }
        });
    } else {
        callback(null, cache);
    }
};
module.exports = {
    get: function(key, callback) {
        loadCache(function(err, cache) {
            callback(err, (cache || {})[key]);
        });
    },
    add: function(key, value, callback) {
        loadCache(function(err, cache) {
            if (err) {
                if (callback) callback(err);
            } else {
                cache[key] = value;
            }
        });
    },
    remove: function(key, callback) {
        loadCache(function(err, cache) {
            if (err) {
                if (callback) callback(err);
            } else {
                delete cache[key];
            }
        });
    },
    save: function(callback) {
        loadCache(function(err, cache) {
            if (err) {
                if (callback) callback(err);
            } else {
                var data = JSON.stringify(cache, null, 4); // save formatted for easier editing
                fs.writeFile('/path-to-strings', data, callback);   
            }
        });
    }
};

<强> App.js

var ActivityType = require('./ActivityType');
...
ActivityType.get('UNAC', function(err, text) {
    if (!err) {
        console.log(text);
    } else {
        console.log('Unable to load string');
    }
});
ActivityType.add('UCAP', 'User changed account password');
ActivityType.remove('UNAC');
ActivityType.save(function(err) {
    if (!err) {
        console.log('Saved successfully!');
    } else {
        console.log('Unable to save strings');
    }
});

或者,您可以在应用启动期间使用明确的loadinit方法。

  

重新部署应用程序有多贵?

这不是我能回答的问题,因为这里没有足够的信息,只有你知道重新部署你的应用程序会有多昂贵。无论如何,确定更新数据库记录或更改资源文件比重新部署更简单?