1

我在一个使用电子的小项目中使用 elasticsearchjs。但不知何故,我遇到了一些奇怪的东西,阻碍了我。

在 Electron 中,我有一个按钮,点击时会触发一个功能:

<button onclick="someFunction()">Click Me</button>

以及以下 Javascript:

import elasticsearch from 'elasticsearch'

function someFunction () {
    console.log('hello world')

    let es = new elasticsearch.Client({
        host: 'http://127.0.0.1:9200',
        log: 'trace'
    })

    es.ping().then(response => {
      console.log(response) // Does not enter, promise is rejected
    })
}

我可以看到hello world输出,但不知何故弹性搜索功能不起作用,我收到超时错误...

但是,如果我对函数的调用加倍,并向 elasticsearch API 添加一个异步调用,它就可以工作,并且我进入了两个then()调用:

import elasticsearch from 'elasticsearch'

function someFunction () {
    console.log('hello world')

    let es = new elasticsearch.Client({
        host: 'http://127.0.0.1:9200',
        log: 'trace'
    })

    es.ping().then(response => {
      console.log(response) // promise resolves once the second one is resolved
    })

    setTimeout(() => {
        es.ping().then(response => {
            console.log(response) // resolves
        })
    }, 500)
}

如果我只放这个setTimeout()函数,它也不起作用,就像我需要调用两次函数才能让它工作一样。

我尝试了一个真正的节点脚本,代码运行良好:

let elasticsearch = require('elasticsearch')

let es = new elasticsearch.Client({
  host: 'http://127.0.0.1:9200',
  log: 'trace'
})

es.ping().then(response => {
  console.log(response) // true
})

Electron 功能可能会阻止我的代码工作,我会错过什么?

谢谢大家的热心回复,祝您有美好的一天。

编辑:这是详细的错误和堆栈跟踪:

Uncaught (in promise) StatusCodeError {status: undefined, displayName: "RequestTimeout", message: "Request Timeout after 3000ms", body: false, stack: "Error: Request Timeout after 3000ms
at /home/j…_modules/elasticsearch/src/lib/transport.js:383:7"}body: falsedisplayName: "RequestTimeout"message: "Request Timeout after 3000ms"status: undefinedstack: "Error: Request Timeout after 3000ms
at /home/johndoe/Code/elastic-ui/node_modules/elasticsearch/src/lib/transport.js:354:15
at /home/johndoe/Code/elastic-ui/node_modules/elasticsearch/src/lib/transport.js:383:7"__proto__: ErrorAbstract
4

1 回答 1

3

我猜测 elasticsearchJS 和 Electron 存在错误,或者您做错了什么。

由于您使用的是 Electron,因此您应该尝试使用该包的浏览器版本。

尝试使用elasticsearch-browser,而不是需要elasticsearch:

yarn add elasticsearch-browser // or npm install elasticsearch-browser

然后只需更换你的

import elasticsearch from 'elasticsearch'

经过

import elasticsearch from 'elasticsearch-browser'.

此版本的包将生成 XHRHttpRequest,而不是使用 node.js 中的本机 http 模块。然后,您将能够使用 Chrome 网络选项卡更轻松地监控您的请求。

我希望这有帮助

更多信息在这里:https ://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/browser-builds.html 聊天对话结束输入消息...

于 2017-08-18T13:04:34.977 回答