在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上。
答案 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;
}