javascript - 我应该对没有数据库操作的方法使用 Meteor 方法 stub 吗?

标签 javascript meteor

我知道我可以在数据库操作实际发生在服务器上之前使用方法 stub 来模拟数据库操作,正如 @Akshat 所解释的 in this excellent answer

我想知道是否可以并且应该使用 stub 来确保用户在不涉及任何数据库操作时有权执行操作(例如显示编辑按钮)。

请注意,我不想使用 alanning:roles 包,我想了解它是如何工作的以及是否可以按如下方式完成:

假设我想检查管理员权限。每个用户文档都有一个 roles 字符串数组字段,我在其中存储用户全局权限,即 useradminsuperadmin

我在 lib 文件夹中声明我的 Users 集合,可供客户端和服务器使用:

let Users = Meteor.users
export default Users

我创建一个方法 stub 来仅检查客户端的管理员权限(它位于客户端文件夹中):

Meteor.methods({ 
  UserIsAdmin = function () {
    console.log(this.isSimulation) //Will be true
    let user = Users.findOne({_id: Meteor.userId()})
    return !!(user && user.roles && user.roles.indexOf('admin') != -1)
  }
});

在服务器文件夹中,我将创建真正的方法,该方法调用下面编写的内部服务器函数(请注意,在这种情况下,我可以将 userId 设置为参数):

import Users from '/imports/user/lib/user_collection.js'

Meteor.methods({ 
  UserIsAdmin = function () {
    console.log(this.isSimulation) //Will be false
    return Users.isAdmin()
  }
});

Users.isAdmin = function (userId=Meteor.userId()) {
  var user = Users.findOne({_id: userId})
  return !!(user && user.roles && user.roles.indexOf('admin') != -1)
};

现在假设我的 UI 上有一个编辑按钮,我根据 UserIsAdmin 方法的结果显示它。问题如下:

  1. 如果用户设法以某种方式更改 Angular 色数组或弄乱该方法,我假设该按钮将一直显示,直到服务器应答方法调用,对吧?但这对延迟没有帮助,无论如何都会加载 UI。
  2. 同样的情况(用户不是管理员,但在本地修改了他的 role 数组),但我们在加载路由之前检查该方法:将加载路由及其 UI,对吧?没有回滚吗?当然,用户界面不会被填充,因为发布不会返回任何内容。
  3. 我拒绝允许/拒绝规则中的每个插入/更新/删除,因此我可以认为用户无法修改自己的文档。如果是这样,是否值得花时间为不执行任何数据库操作的方法编写方法 stub ?我的意思是,这不是保护 UI 的可靠方法(请参阅上面的问题 2),而且数据无论如何都不会被发布。除了数据库操作之外,是否存在编写方法 stub 有意义的情况?

最佳答案

您的代码取决于 Meteor 方法的返回值,但您有一个客户端和一个服务器端返回值。幸运的是,您将获得哪一个是明确定义的:

  • 如果您的 Meteor.call() 中有回调,则 call 函数不会返回任何内容,并且将通过服务器调用回调函数-侧返回值。
  • 如果您的 Meteor.call() 中没有回调,那么您将同步获取客户端返回值。

无论哪种方式,您都只会看到其中一个返回值。它与订阅不同,订阅的值稍后会以某种方式同步。请参阅此处的文档:http://docs.meteor.com/#/full/meteor_call

并回答您的问题:

  1. 取决于您是否使用回调。如果没有,则会出现管理 UI,并且不会回滚。
  2. 与 1 相同。
  3. 您应该始终假设用户能够并且愿意修改所有客户端数据。拒绝规则根本不会改变这一点,它们只会阻止这些更改传播到服务器。

除了数据库操作之外,您还可以使用服务器端方法调用执行多种操作,例如使用 key 访问第 3 方 REST API、启动后台操作等。

alanning:roles 包的工作方式是它有一个通过订阅保持同步的 roles 集合。他们的 Roles.userIsInRole 函数不是 Meteor 方法,而是查询此集合的简单函数调用。

关于javascript - 我应该对没有数据库操作的方法使用 Meteor 方法 stub 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477831/

相关文章:

ios - 'meteor build',cordova - ios 平台错误

用于验证电子邮件地址的 JavaScript/Jquery RegEx 无法正常工作

javascript - 在异步回调中使用 _.after() ,污染数组变量

algorithm - (facebook like app) show post algorithm design

meteor - Meteor 有没有办法立即重新渲染?

javascript - 用于在长时间运行的服务器转换期间更新 UI 的 Meteor 模式

meteor - 我可以使用 Meteor Shell 运行单线吗?

javascript - 无法在 'fetch' 无效模式上执行 'Window'

javascript - 样式化 JS 生成的代码

javascript - React---类型错误: Cannot read property 'map' of undefined