当前位置: 首页 > 面试题库 >

如何通过NodeJS调用elasticsearch api?

唐弘和
2023-03-14
问题内容

我的任务是对elasticsearchAPI进行POST API调用,

https://search-test-search-fqa4l6ubylznt7is4d5yxlmbxy.us-
west-2.es.amazonaws.com/klove-ddb/recipe/_search

我以前没有对AWS服务进行API调用的经验。

所以,我尝试了-

axios.post('https://search-test-search-fqa4l6ubylznt7is4d5yxlmbxy.us-west-2.es.amazonaws.com/klove-ddb/recipe/_search')
            .then(res => res.data)
            .then(res => console.log(res));

但是我收到了{“ Message”:“ User:匿名用户无权执行:es:ESHttpPost”}

我还签出了一些IAM角色,并将AWSESFullAccess策略添加到我的配置文件中。

我仍然无法解决任何问题。

请帮我。


问题答案:

您看到此错误的原因User: anonymous is not authorized to perform: es:ESHttpPost是因为您在发出数据请求时没有让ElasticSearch知道您是谁-这就是为什么它说“匿名”的原因。

身份验证有两种方式,最简单的方法是使用elasticsearch库。使用此库,您将为IAM角色/用户提供一组凭据(访问密钥,秘密密钥)。它将使用它来创建签名的请求。签名的请求将使AWS知道是谁在实际发出请求,因此不会以匿名方式接收,而是您自己。

使它起作用的另一种方法是将访问策略调整为基于IP:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "es:*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "AAA.BBB.CCC.DDD"
                    ]
                }
            },
            "Resource": "YOUR_ELASTICSEARCH_CLUSTER_ARN"
        }
    ]
}

对于您在此处提供的ip(范围)的任何人,此特定策略将是开放的。但是,这将使您免于必须签署请求的麻烦。

elasticsearch-js是一个有助于设置AWS
ES的库

一个有效的示例如下:

const AWS = require('aws-sdk')
const elasticsearch = require('elasticsearch')
const awsHttpClient = require('http-aws-es')

let client = elasticsearch.Client({
    host: '<YOUR_ES_CLUSTER_ID>.<YOUR_ES_REGION>.es.amazonaws.com',
    connectionClass: awsHttpClient,
    amazonES: {
        region: '<YOUR_ES_REGION>',
        credentials: new AWS.Credentials('<YOUR_ACCESS_KEY>', '<YOUR_SECRET_KEY>')
    }
});

client.search({
    index: 'twitter',
    type: 'tweets',
    body: {
        query: {
            match: {
                body: 'elasticsearch'
            }
        }
    }
})
.then(res => console.log(res));


 类似资料:
  • 问题内容: 我正在尝试从外部PHP文件将JavaScript函数调用为JavaScript脚本。我的代码又大又不同,所以我在这里编写示例代码。 这是我的PHP代码: 这是我的JavaScript代码: 这就是我想要做的。 我 原来的 PHP文件不包含这些数学函数,但是想法是相同的。 如果一些它怎么没有一个妥善的解决办法,那么可能你 请 提出一种替代,但它应该从外部PHP调用值。 问题答案: 是的,

  • 问题内容: 我目前正在使用HTTP方法来调用一些URL,这将导致JIRA问题。 现在,我想使用Apache Camel,该如何使用? 我需要通过骆驼调用以下链接: 由于我是Camel的新手,因此也请提出一些解决方案和示例。 谢谢 问题答案: 您可以轻松使用CXFRS组件;如果出于某种原因需要使用HTTP组件进行操作,则也可以轻松地使用它: 当然,在到达路由的这一部分之前,您将需要使用标头来丰富您的

  • 问题是Netbeans的默认配置无法在调试模式下正确启动Spring,并且当您在internet上搜索时,您只能在Spring文档中找到过时的信息,而这些信息将不起作用。 如果你知道怎么做,解决方法很简单。请在下面找到正确的设置说明。

  • 问题内容: 我正在尝试通过NodeJS子进程在Windows上运行命令: 当它调用时,它将其写入描述符,但是此时我如何触发响应?当您实际在命令提示符下键入命令时,如何发送“输入”键信号?目前我没有收到任何回应。 问题答案: 发送换行符将执行该命令。将退出外壳。 我在OSX上修改了该示例以使其与bash一起使用。 输出将是:

  • 我已经尝试了。所有的失败都表明协议必须是HTTP或HTTPS。 Node有可用的FTP客户端(在npmjs上可用)。但是,根据他们的文档,他们需要创建一个到FTP服务器的连接,更改目录,然后下载它。 有什么简单的解决方法吗?

  • 问题内容: 我有一个通常从命令行启动的Java程序。从命令行启动后,Java程序将一直运行直到被按下Ctrl + C退出或杀死另一个脚本中的命令为止。Java程序向控制台输出错误消息(如果有)。 现在,我想开发基于Express的NodeJs Web应用程序。当用户单击链接(运行)时,单击处理程序将调用Ajax请求,这将导致后端NodeJs脚本运行该Java程序(如果尚未运行)。另一个链接(停止)