- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标:用户上传到 S3,触发 Lambda 获取文件并发送给 Google Vision API 进行分析,返回结果。
根据this , google-cloud
需要 native 库,并且必须针对 lambda 运行的操作系统进行编译。使用 lambda-packager 会引发错误,但一些互联网搜索发现使用带有 Node 和 NPM 的 EC2 来运行安装。本着破解这个问题的精神,我就是这么做的,让它大部分正常工作*。至少 lambda 不再给我 ELF header 错误。
我当前的问题是,有两种方法可以调用 Vision API,两种方法都不起作用,而且都返回不同的错误(大多数情况下)。
<小时/>通用代码:此代码始终相同,位于函数的顶部,我将其分开以使后面的代码块集中于该问题。
'use strict';
const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const Bucket = 'my-awesome-bucket';
const gCloudConfig = {
projectId: 'myCoolApp',
credentials: {
client_email: 'your.serviceapi@project.email.com',
private_key: 'yourServiceApiPrivateKey'
}
}
const gCloud = require('google-cloud')(gCloudConfig);
const gVision = gCloud.vision();
<小时/>
使用detect()
:此代码始终返回错误Error: error:0906D06C:PEMroutines:PEM_read_bio:no start line
。理论上它应该有效,因为 URL 是公开的。通过搜索错误,我认为这可能是 HTTPS 问题,因此我什至尝试了一种变体,将 HTTPS 替换为 HTTP,但得到了相同的错误。
exports.handler = (event, context, callback) => {
const params = {
Bucket,
Key: event.Records[0].s3.object.key
}
const img = S3.getSignedUrl('getObject', params);
gVision.detect(img, ['labels','text'], function(err, image){
if(err){
console.log('vision error', err);
}
console.log('vision result:', JSON.stringify(image, true, 2));
});
}
<小时/>
使用detectLabels()
:此代码始终返回错误:ENAMETOOLONG:名称太长,打开..[base64中的图像].. .
。根据建议,人们认为该方法不应该传递base64图像,而应该传递公共(public)路径;这可以解释为什么它说名称太长(base64 图像就是 URL)。不幸的是,这给出了上面的 PEM 错误。我还尝试过不进行 base64 编码并直接从 aws 传递对象缓冲区,但这也导致了 PEM 错误。
exports.handler = (event, context, callback) => {
const params = {
Bucket,
Key: event.Records[0].s3.object.key
}
S3.getObject(params, function(err, data){
const img = data.Body.toString('base64');
gVision.detectLabels(img, function(err, labels){
if(err){
console.log('vision error', err);
}
console.log('vision result:', labels);
});
});
}
<小时/>
根据Best Practices ,图像应该是base64编码的。
从 API 文档和示例以及其他内容来看,我似乎正确使用了这些。我感觉我已经将所有这些文档阅读了一百万遍。
如果 NAMETOOLONG 错误需要 base64 内容,我不确定如何处理。这些图像不超过 1MB。
*PEM 错误似乎与凭据有关,并且因为我了解所有这些凭据如何工作以及如何在 EC2(没有任何类型的 PEM 文件)上编译模块,这可能是我的问题问题。也许我需要在运行 npm install 之前设置一些凭据,类似于需要安装在 Linux 机器上?这开始超出了我的理解范围,所以我希望这里有人知道。
理想情况下,使用 Detect
会更好,因为我可以指定我想要检测的内容,但只要从 Google 获得任何有效响应就非常棒了。如果您能提供任何线索,我们将不胜感激。
最佳答案
因此,与另一位同事的对话让我考虑放弃整个 API 加载并使用 google-cloud
模块。相反,我应该考虑通过 curl
尝试 Cloud REST API,看看它是否可以这样工作。
长话短说,我解决这个问题的方法是发出 HTTP 请求并使用适用于 Google Cloud 的 REST API。
这是我现在可用的 lambda 函数。可能仍需要调整,但这正在起作用。
'use strict';
const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const Bucket = 'yourBucket';
const fs = require('fs');
const https = require('https');
const APIKey = 'AIza...your.api.key...kIVc';
const options = {
method: 'POST',
host: `vision.googleapis.com`,
path: `/v1/images:annotate?key=${APIKey}`,
headers: {
'Content-Type': 'application/json'
}
}
exports.handler = (event, context, callback) => {
const req = https.request(options, res => {
const body = [];
res.setEncoding('utf8');
res.on('data', chunk => {
body.push(chunk);
});
res.on('end', () => {
console.log('results', body.join(''));
callback(null, body.join(''));
});
});
req.on('error', err => {
console.log('problem with request:', err.message);
});
const params = {
Bucket,
Key: event.Records[0].s3.object.key
}
S3.getObject(params, function(err, data){
const payload = {
"requests": [{
"image": {
"content": data.Body.toString('base64')
},
"features": [{
"type": "LABEL_DETECTION",
"maxResults": 10
},{
"type": "TEXT_DETECTION",
"maxResults": 10
}]
}]
};
req.write(JSON.stringify(payload));
req.end();
});
}
关于javascript - AWS Lambda w/Google Vision API 抛出 PEM_read_bio:no start line 或 Errno::ENAMETOOLONG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40032758/
当前问题陈述的输入是 - 输入.txt #START_OF_TEST_CASES #DATA key1:VA1 key2:VA2 key3:VA3 key4:VA4 key5:VA5 #DEND #E
编辑:添加了 PDO 调用。 这是实际的错误: Notice: Object of class PDOStatement could not be converted to int in Unknow
“git diff --stat”和“git log --stat”显示如下输出: $ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56
我有一个具有以下格式的输入文件:安大略省:布兰普顿:北纬 43° 41':西经 79° 45'安大略省:多伦多:北纬 43° 39':西经 79° 23'魁北克省:蒙特利尔:北纬 45° 30':西经
空白行仅包含\n或\r\n或\r。 tempfile = open(file,"r") for id,line in enumerate(tempfile): if(line != "\n"
我尝试使用 BABYLON.js 开发棋盘游戏我有一个板子和一个 ArcRotateCamera。 我的灯是 HemisphericLight 当我在板上画线时,我希望这些线具有相同的外观。现在,当我
我尝试使用 BABYLON.js 开发棋盘游戏我有一个板子和一个 ArcRotateCamera。 我的灯是 HemisphericLight 当我在板上画线时,我希望这些线具有相同的外观。现在,当我
有一个while read循环: while read line; do grep "^$line" file1 done < target 我应该使用 "^$line" 来获得正确答案。我想
我有一个我无法解决的 numpy 问题。我有填充 0 和 1 的 3D 数组 (x,y,z)。例如,z 轴上的一个切片: array([[1, 0, 1, 0, 1, 1, 0, 0],
作为临时方法,我使用 .txt 文件来存储程序的某些变量。写入与 fs.appendFile 完美配合,但考虑到它的大小,使用 fs.readFile 读取不合适 - 我想得到某一行 来自文件,以及
我试图找到一种通过R studio进行调试的方法,但是我发现的所有解决方案都无法真正起作用。 1.)CTRL + enter:有效,但不会通过循环的每次迭代,而只能执行一次。 2.)添加“browse
在我的应用程序中,我的 EditText 左侧有行号 - 到目前为止一切都很好,行号与 EditText 的行完全对齐。 问题是,如果用户更改 EditText 的文本大小,则行号无法正确对齐。所以我
通过使用 + 的参数调用它,我可以使 vim 将光标定位在文件的最后一行。 : vi + myfile # "+" = go to last line of file 我怎样才能做到
我已经在文件中写入了这样的数据(某种) {:a 25 :b 28} {:a 2 :b 50} ... 我想要这些 map 的惰性序列。 大约有 4000 万行。我也可以写 10000 的 block
我在文本区域中发现了一个奇怪的错误(?)... 比如说,有一个 使用多行文本(用户粘贴的文本或预设文本无关紧要,两者都经过测试)。 我想从 中获取文本并替换 \n与其他东西......结果是,.re
我需要一个新行,这样我就可以在 PFD 中看到一个格式,我尝试添加一个页面宽度但它没有用,我用另一个东西/n 也没有用。这是我的代码。我可以手动添加格式,因为我需要显示从数据库中获取的信息,并且我在一
我正在尝试编写一个 Java 程序,它将大量 GPS 坐标捕捉到线形文件(道路网络),并且不仅返回新坐标,还返回捕捉到的线段的唯一标识符。该标识符是否是 FID、其他语言中使用的“索引”(即,其中 1
你好,我正在努力处理 JavaScript/NodeJS 中的数组。 基本上,这是我的代码: let arr = new Array(); arr = { "Username" : var1,
我正在学习 matplotlib 的基本教程,我正在处理的示例代码是: import numpy as np import matplotlib.pylab as plt x=[1,2,3,4] y=
所以,假设我有一个包含 20 行的文本文件,每行都有不同的文本。我希望能够有一个包含第一行的字符串,但是当我执行 NextLine(); 时我希望它成为下一行。我试过了,但它似乎不起作用: strin
我是一名优秀的程序员,十分优秀!