我正在Bluemix 上构建一个带有Cloudant 数据存储的Angular SPA。
由于 OpenWhisk 的 Bluemix 实现不使用 VCAP 服务,因此我看到了 3 个选项来使用 OpenWhisk 作为我的 api 提供程序来为我的 Angular 应用程序进行云查询:
- 遵循此处所示的传递凭证模式:https ://github.com/IBM-Bluemix/openwhisk-visionapp (顺便说一句非常有趣的方法)
- 包括我在本地运行的凭据,如下所示:https ://github.com/IBM-Bluemix/nodejs-cloudant/blob/master/app.js
- 使用此处所示的 http API:https ://docs.cloudant.com/api.html (突出显示传递凭据的安全问题。
由于我的服务不是为了发布(它是为了我自己的应用程序),我认为选项 2 是我的“万恶之源”选择。我错过了什么吗?我的想法是,虽然对更改很脆弱,但它是最安全的,因为凭据不会公开传递。无服务器基础设施将不得不被黑客入侵......
提前致谢!
(冗长)更新:(提前道歉)
我已经走得更远了,但仍然没有答案 - 现在被困在执行中。
澄清一下,我的目标是让应用程序从 Angular Client -> OpenWhisk -> Cloudant 流出。
在这个最简单的用例中,我想传递一个 startTime 参数和一个 endTime 参数,让 OpenWhisk 获取该时间范围内的所有记录以及所有字段,然后传回选定的字段。在我的示例中,我有经过修改的 GeoJSON 格式的 USGS 地震数据。
根据以下文章中的信息,我得出结论,我可以调用 wsk 命令行操作并使用我在 Javascript 函数中设置的绑定,因此不会将我的凭据传递给数据库。这给了我一定程度的安全性(仍然质疑我的 OpenWhisk 操作的其余端点),但我认为,一旦我的示例运行起来,我就会考虑其中的那一部分。
我的命令行(有效):
wsk action invoke /my@orgname.com_mybluemixspace/mycfAppName/exec-query-find --blocking --result --param dbname perils --param query {\"selector\":{\"_id\":{\"$gt\":0},\"properties.time\":{\"$gt\":1484190609500,\"$lt\":1484190609700}}}
这成功返回以下内容:
{
"docs": [
{
"_id": "eq1484190609589",
"_rev": "1-b4fe3de75d9c5efc0eb05df38f056a65",
"dbSaveTime": 1.484191201099e+12,
"fipsalpha": "AK",
"fipsnumer": "02",
"geometry": {
"coordinates": [
-149.3691,
62.5456,
0
],
"type": "Point"
},
"id": "ak15062242",
"properties": {
"alert": null,
"cdi": null,
"code": "15062242",
"detail": "http://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/ak15062242.geojson",
"dmin": null,
"felt": null,
"gap": null,
"ids": ",ak15062242,",
"mag": 1.4,
"magType": "ml",
"mmi": null,
"net": "ak",
"nst": null,
"place": "45km ENE of Talkeetna, Alaska",
"rms": 0.5,
"sig": 30,
"sources": ",ak,",
"status": "automatic",
"time": 1.484190609589e+12,
"title": "M 1.4 - 45km ENE of Talkeetna, Alaska",
"tsunami": 0,
"type": "earthquake",
"types": ",geoserve,origin,",
"tz": -540,
"updated": 1.484191127265e+12,
"url": "http://earthquake.usgs.gov/earthquakes/eventpage/ak15062242"
},
"type": "Feature"
}
]
}
我在 OpenWhisk(如下)中创建的操作返回内部服务器错误。我将输入值传递为
{
"startTime": "1484161200000",
"endTime": "1484190000000"
}
这是我的操作的代码:
`var openWhisk = require('openwhisk');
var ow = openWhisk({
api_key:'im really a host'
});
function main(params) {
return new Promise(function(resolve, reject) {
ow.actions.invoke({
actionName:'/my@orgname.com_mybluemixspace/mycfAppName/exec-query-find',
blocking:true,
parameters:{
dbname: 'perils',
query: {
"selector": {
"_id": {
"$gt": 0
},
"properties.time": {
"$gt": params.startTime,
"$lt": params.endTime
}
}
}
}
}).then(function(res) {
//get the raw result
var raw = res.response.result.rows;
//lets make a new one
var result = [];
raw.forEach(function(c) {
result.push({id:c.docs._id, time:c.docs.properties.time, title:c.docs.properties.title});
});
resolve({result:result});
});
});
}`
以下是我研究的链接:http:
//infrastructuredevops.com/08-17-2016/news-openwhisk-uniq.html
有用,因为使用了 exec-query-find 和选择器语法用法,但也很酷我需要为填充数据而构建的更新功能!
https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk
@csantanapr 引用的文章
我忽略了什么吗?
谢谢!