Strongloop / loopback remoteMethod保存到数据库

时间:2016-01-27 18:04:14

标签: mongodb strongloop loopback

所以,我正在学习strongloop API,并扩展我的API:https://docs.strongloop.com/display/public/LB/Extend+your+API

我修改了getName示例:

Node.setData = function(response, cb) {
  console.log(response)      
  // cb(null, response);
};
Node.remoteMethod(
  'setData',
  {
    http: {path: '/:id/setData', verb: 'get'},
     accepts: [ 
       {arg:'data', type:'string'}, 
       {arg:'id', type:'string', required: true}
     ],
     returns: {arg: 'setData', type: 'string'},
     description: [ 'set some Data ']
  }
);

哪个按预期工作(至少在列表中显示):

enter image description here

我希望澄清的内容无法在文档中的任何位置找到:

  1. 如何告诉我的数据库连接器(MongoDB)放入数据,因为strongloop附带了许多默认的remoteMethods,但我无法找到它们的定义方式。并且数据以半自动方式工作,但在文档中设置似乎非常模糊。
  2. 我假设我不应该与数据库连接器通信,而是通过某个环回接口;
  3. 如何/在何处使用Node.updateAttribute('data', 'test')之类的方法,因为在Node.setData函数内部我得到了未定义的方法。我认为它是persistedModel的一部分但是,我使用它对我来说是一个谜。
  4. 为什么cb()未定义,而在示例中应该有效
  5. 我也用动词post尝试了它,但这不应该,我希望能够在收到请求时将一些数据写入数据库。

    我可能不是第一个发现Strongloop相当陡峭的学习曲线的人。有人知道任何能让我更好理解的教程吗?我已经完成了核心概念并开始使用,但我觉得我根本没有开始。

1 个答案:

答案 0 :(得分:1)

您可以通过设置指向本地计算机上的mongodb实例(或MongoLab等远程MongoDB服务)的数据源来告知MongoDB存储内容:

假设您已在本地运行mongod并安装了mongodb连接器,请将其添加到datasources.json

"mongoDS": {
  "host": "localhost",
  "port": 27017,
  "database": "databasename",
  "username": "dbo",
  "password": "password",
  "name": "mongoDS",
  "connector": "mongodb"
}

然后,您需要配置所有模型定义,以使用上面mongoDS内的model-config.json

...snip...
"User": {
  "dataSource": "mongoDS",
  "public": true
},
"AccessToken": {
  "dataSource": "mongoDS",
  "public": false
},
"ACL": {
  "dataSource": "mongoDS",
  "public": false
},
...snip...

有关详细信息,请参阅https://docs.strongloop.com/display/public/LB/MongoDB+connector

将数据写入数据库的“环回方式”是通过实例化和使用您在common/models文件夹中定义的模型。要查看默认情况下loopback附带的模型,您可以查看node_modules/loopback/common/models文件夹。查看user.js文件,了解如何管理应用用户以及定义所有功能的位置。这就是“神奇”的地方。 ;)

为了使用node.updateAttributes()之类的方法,您需要首先使用其中一个内置查询方法(如Node.findById()获取Node模型的实例

Node.findById(1, function(err, nodeInstance) {
  if(err) return(err);
  // nodeInstance is now the node instance obj with id = 1
  // inside this callback function

  nodeInstance.updateAttributes({name: 'Fred'}, function() {...})
});

这假设存在一个id为1且具有name属性的Node条目,您可以使用Loopback REST Explorer创建该条目。在您的示例代码中,您创建的setData()远程方法是一种“类方法”,它没有与之关联的特定节点实例。即使在远程方法中,您也需要使用Model.find()和其他方法来获取实例结果,以便在它们上使用实例方法。

https://docs.strongloop.com/display/public/LB/Remote+methods

cb回调参数是远程方法成功或失败时需要调用的函数,以便API可以继续处理并成功返回。对于成功案例,请执行

cb(null, response);

,对于错误案例,

cb(error, null);

另外,只需记下您发布的代码,您所在的位置

Node.setData = function(response, cb) {...}

而不是function(response, cb),应该是function(data, id),以匹配

中定义的远程方法签名
accepts: [ 
  {arg:'data', type:'string'}, 
  {arg:'id', type:'string', required: true}
]

因为远程方法需要2个字符串参数,一个名为data,另一个名为id