流星机密服务器代码 - 引用错误,变量未定义

时间:2017-07-26 08:10:08

标签: meteor server hidden

在meteor docs(https://guide.meteor.com/security.html#secret-code)中的秘密服务器代码部分,他们似乎只使用在服务器上定义的全局变量,因此,只能在服务器上看到和访问代码。看起来很简单。

但是当我做的时候

upload = { test: "my secret code" }

在文件夹server/upload.js内,我收到错误

W20170726-10:04:59.843(2)? (STDERR) 
C:\Users\myuser\AppData\Local\.meteor\packages\meteor-tool\1.5.0\mt-os.windows.x86_32\dev_bundle\server-lib\node_modules\fibers\future.js:280
W20170726-10:04:59.844(2)? (STDERR)                                             throw(ex);
W20170726-10:04:59.846(2)? (STDERR)                                             ^
W20170726-10:04:59.847(2)? (STDERR)
W20170726-10:04:59.847(2)? (STDERR) ReferenceError: upload is not defined
W20170726-10:04:59.848(2)? (STDERR)     at meteorInstall.server.upload.upload.js (server/upload/upload.js:1:1)
W20170726-10:04:59.849(2)? (STDERR)     at fileEvaluate (packages\modules-runtime.js:333:9)
W20170726-10:04:59.850(2)? (STDERR)     at require (packages\modules-runtime.js:228:16)
W20170726-10:04:59.851(2)? (STDERR)     at C:\Users\myuser\Documents\projects\myproject\.meteor\local\build\programs\server\app\app.js:10417:1
W20170726-10:04:59.852(2)? (STDERR)     at C:\Users\myuser\Documents\projects\myproject\.meteor\local\build\programs\server\boot.js:338:34
W20170726-10:04:59.853(2)? (STDERR)     at Array.forEach (native)
W20170726-10:04:59.854(2)? (STDERR)     at Function._.each._.forEach (C:\Users\myuser\AppData\Local\.meteor\packages\meteor-tool\1.5.0\mt-os.windows.x86_32\dev_bundle\server-lib\node_modules\underscore\underscore.js:79:11)
W20170726-10:04:59.855(2)? (STDERR)     at C:\Users\myuser\Documents\projects\myproject\.meteor\local\build\programs\server\boot.js:158:5
W20170726-10:04:59.856(2)? (STDERR)     at C:\Users\myuser\Documents\projects\myproject\.meteor\local\build\programs\server\boot.js:387:5
W20170726-10:04:59.858(2)? (STDERR)     at Function.run (C:\Users\myuser\Documents\projects\myproject\.meteor\local\build\programs\server\profile.js:510:12)

文档是错误的还是我只是在做一些奇怪的事情?我使用meteor版本1.5.0,发生在Windows和Linux上。

2 个答案:

答案 0 :(得分:1)

文档说明,

  

应用中的秘密业务逻辑应位于代码中   仅加载在服务器上

它(遗憾的是)暗示,流星方法或验证方法的代码也在客户端上实际执行(参见this.isSimulation),作为乐观UI的一部分,因此可能会泄露密钥,例如密钥。 / p>

此处global.myvariable = { ... }使用not a good solution

为了让您更清楚,我稍微从文档中扩展了示例:

/server/mmr.js (仅由您的服务器加载)

export const MMR = {
  updateWithSecretAlgorithm(userId) {
    // your secret code here
  }
}

/both/updatemmr.js (由服务器和客户端加载)

if (Meteor.isServer) {
    //eslint will nag but it does not cause any error
    import {MMR} from '../server/mmr.js';
}

// In a file loaded on client and server
const Meteor.users.methods.updateMMR = new ValidatedMethod({
  name: 'Meteor.users.methods.updateMMR',
  validate: null,
  run() {
    if (this.isSimulation) {
      // Simulation code for the client (optional)
    } else {
      MMR.updateWithSecretAlgorithm(this.userId);
    }
  }
});

Meteor.isServer仅确保客户端不会尝试导入MMR,这会导致启动时出错。只要在服务器上加载mmr.js文件,就不会有暴露给客户端的MMR对象。

我希望这会让这个例子更加清晰。

答案 1 :(得分:0)

好的,出于某种原因,只需键入myvariable = { ... }将其添加到全局对象中,因此我使用global.myvariable = { ... }明确添加了i。到目前为止它似乎运作良好!

修改

正如Jankapunkt正确指出的那样,确实不鼓励全局变量。但是不像在Jankapunkt建议的那样在if语句中使用import,而是应该使用ask的CommonJS语法,如meteor docs(https://guide.meteor.com/structure.html#using-require)中所建议的那样,例如。

let MMR;
if (Meteor.isServer) {
   MMR = require('../server/mmr.js').MMR;
}