我在哪里存储我需要在Meteor应用程序中的客户端和服务器上引用的只读CONSTANT值?

时间:2014-10-03 22:30:11

标签: meteor

关于此问题有几个问题和帖子,但我仍然没有找到一个好的答案。我有一个Meteor应用程序,我想存储一个CONSTANTS的大型配置文件,它将在我的应用程序中用于服务器和客户端,如下所示:

//  Constant values used throughout app
DEFAULT_PLAYERS_PER_GAME = 4;
DEFAULT_LENGTH_OF_GAME = 300000;
DEFAULT_PLAYER_ACCOUNT_TYPE = 'basic';

BASIC_MONTHLY_FEE = 0;
PREMIUM_MONTHLY_FEE = 2.99;

//  etc.etc.

理想情况下,我希望所有这些值都在在一个文件中的一个位置,我还需要在客户端上引用它们。例如,在注册模板中向用户显示月费。该费用将来自我的配置文件中的一个位置。

每次我需要在我的应用程序中实际引用服务器事务的CONSTANT时,我知道我将从Meteor方法后面的服务器获取值,以防止用户更改客户端上的值。我还没有在我的应用结构中找到一个位置,让客户端可以访问这些CONSTANTS而无法更改它们。

如果它们仅存储在客户端上,那么当服务器访问它们时,用户只需使用JavaScript控制台即可更改它们。如果它们仅存储在服务器上,那么我无法从客户端访问它们以向用户显示值。我假设如果他们存储在客户端/服务器文件夹中,他们仍然可以被客户端上的用户更改。

我有几个想法,但我发现它们都不理想:

  1. 仅将它们存储在服务器上,并使用Meteor方法将其值返回给客户端。这很麻烦,因为我发现从客户端获取Meteor方法的值的唯一方法是在Meteor方法回调中设置会话变量,这并不总是及时工作,因为回调是异步的。

  2. 使用环境变量。这对于安全值很有用,但客户端无法看到这些值。

  3. 在服务器和客户端上有两个单独的配置文件,并确保所有服务器事务都使用服务器配置文件,因此值不能更改?我不喜欢这样,因为您必须更新两个不同文件中的值。

1 个答案:

答案 0 :(得分:5)

Meteor的优点在于,您可以将所有常量存储在一个唯一的源文件中,并在客户端和服务器上同时提供它们。

这就是为什么我将这些常量放在lib/constants.js下,因为您可能知道共享的lib目录导出的变量可供客户端和服务器使用。

你似乎没有意识到的缺点是即使变量出现在一个唯一的文件中定义并且可以在" shared"环境,它们实际上是在两个环境中单独定义的:服务器的Node.js全局上下文和客户端的浏览器窗口对象。

这就是为什么即使恶意用户在浏览器控制台中写SOME_CRITICALLY_IMPORTANT_CONSTANT = "hacky value;",他实际上也是在引用window.SOME_CRITICALLY_IMPORTANT_CONSTANT,并且这无法修改具有相同名称的服务器变量。生活在一个独立,私密和安全的环境中。

这就是为什么如果一个用户在他的浏览器环境(window对象)中定义了他自己的常量副本,那么这可能无法对服务器造成伤害,它只会打破他的用户体验但是,他应该这样做。