在环回模型

时间:2017-01-27 16:11:05

标签: node.js rest loopback

我正在使用loopback 3。 我在我的模型的js(survey.js)中有这些代码行:

let enabledRemoteMethods = []

Survey.sharedClass.methods().forEach(function(method) {
  console.log(method.name, method.isStatic)
  let matchingEnabledRemoteMethod = _.find(enabledRemoteMethods, {name: method.name});

  if (!matchingEnabledRemoteMethod) {
    Survey.disableRemoteMethodByName(method.name, method.isStatic);
  }
});

几乎可以。我仍然可以在资源管理器中看到“PATCH / surveys / {id}”的REST端点。我的期望是:浏览器中不应该列出任何REST端点。

然后我检查了与该操作对应的URL,它是:

http://localhost:3000/explorer/#!/Survey/Survey_prototype_patchAttributes

enter image description here

根据文档,这意味着patchAttributes是一种静态方法。

然后我用控制台中的输出交叉检查......它说:pathAttributes 不是静态。

Incosistency!

enter image description here

我甚至试过添加这一行:

Survey.disableRemoteMethodByName("patchAttributes", true);

另外

Survey.disableRemoteMethodByName("patchAttributes", false);

没有运气。

有人可以确认它是否是loopback 3中的错误(我不知道环回2,还没检查过)?如果这是一个错误,我不必花时间在它上面等待它修复。但如果它不是一个bug,有人可以指出我的代码中缺少什么吗?

谢谢!

更新:弄清楚如何

有了这条线,我就能摆脱它:

Survey.disableRemoteMethodByName("prototype.patchAttributes", true);

第二个参数似乎并不重要(你也可以放错)。不知道为什么(我想它应该只接受真实)。

这是我目前的解决方案:

let disabledPrototypesRemoteMethods = ['patchAttributes']
let enabledRemoteMethods = [
  "create", "findById", "replaceById", "deleteById",
  "replaceOrCreateQuestion"
]
Survey.sharedClass.methods().forEach(function(method) {
  if (enabledRemoteMethods.indexOf(method.name) == -1) {
    Survey.disableRemoteMethodByName(method.name);
  }

  if (disabledPrototypesRemoteMethods.indexOf(method.name) > -1) {
    Survey.disableRemoteMethodByName("prototype." + method.name);
  }
});

仍然是一个小细节:这个东西仍然显示出来(我想它为replaceById操作的普通PUT提供了POST选择......但是我不想要它;我想强制我的API的用户仅与PUT一起使用):

http://localhost:3000/explorer/#!/Survey/Survey_replaceById_post_surveys_id_replace

enter image description here

我尝试添加此行:

Survey.disableRemoteMethodByName("replaceById_post_surveys_id_replace");

没有运气。

无论如何......希望这对其他人有用; loopback doc有点粗略。

1 个答案:

答案 0 :(得分:2)

您也可以通过查看stringName属性来获取原型方法。这样您就可以在列表中包含原型。

stringName在值中包含sharedClass名称,因此您需要解析它。

module.exports = BusinessProfileContacted => {
  const enabledRemoteMethods = ["create", "findById", "replaceById", "deleteById", "replaceOrCreateQuestion", "prototype.replaceAttributes"];

  Survey.sharedClass.methods().forEach(method => {
    const methodName = method.stringName.replace(/.*?(?=\.)/, '').substr(1);
    if (enabledRemoteMethods.indexOf(methodName) === -1) {
      Survey.disableRemoteMethodByName(methodName);
    }
  });
};