javascript - Cum să rezolv 'Eroare: connect ECONNREFUSED 127.0.0.1:9200' utilizând ElasticSearch cu Firebase?


Știu că această întrebare a fost pusă de mai multe ori, dar soluțiile nu se aplicau situației mele. Am pornit ElasticSearch, Kibana folosind aceste 2 comenzi:

bin/elasticsearch
bin/kibana

Și serverul rulează bine, atunci când folosesc browserul pentru a accesa http://localhost:9200, obțin următorul rezultat:

{
    "name" : "vg7RnLh",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "gqDf0H67TxGZGYigAlu2mQ",
    "version" : {
        "number" : "6.1.2",
        "build_hash" : "5b1fea5",
        "build_date" : "2018-01-10T02:35:59.208Z",
        "build_snapshot" : false,
        "lucene_version" : "7.1.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
    },
    "tagline" : "You Know, for Search"
}

Și atunci când folosesc kibana, totul funcționează bine. Iată funcția cloud Firebase pe care am scris-o, dacă e ceva în neregulă, cred că este aici:

exports.downloadUserInfo = functions.https.onRequest((req, res) => {
    const { uid } = req.query;

    const searchConfig = {
        uri: 'http://localhost:9200/users/user/' + uid,
        method: 'GET'
    };

    request(searchConfig)
        .then((result) => {
           console.log(result);
           return res.status(200).send(result);
       })
           .catch((error) => {
               console.log(error);
               return res.status(400).send(error);
           });
});

Unde request este un modul instalat prin yarn add request request-promise. Apoi, atunci când folosesc Postman pentru a-mi testa API-ul, primesc această eroare:

Cum rezolv asta?

Actualizare

Rulez și eu flashlight folosind comanda node app.js. Când inserez un utilizator nou în baza de date, noul utilizator este inserat automat și pe serverul ElasticSearch (localhost), însă, când încerc să citesc, apare o eroare de cerere

A doua actualizare

Aceasta este API-ul care creează un utilizator:

exports.register = functions.https.onRequest((req, res) => {
    const { firstName, lastName } = req.body;

    admin.database().ref('users').push({ firstName, lastName })
        .then(() => res.status(201).send())
        .catch(() => res.status(400).send());
});

Atunci când un utilizator nou este creat prin această API, acest utilizator este introdus automat pe serverul meu ElasticSearch local, deoarece folosesc pluginul flashlight. Nu înțeleg de ce, atunci când încerc să citesc de pe același server, apare o eroare de cerere.

Răspuns #1

Codul tău încearcă să acceseze gazda locală:

uri: 'http://localhost:9200/users/user/' + uid,

Acest lucru nu va funcționa: nu poți pur și simplu să accesezi porturi „aleatoare” pe containerul unde rulează funcțiile tale Cloud.

Bănuiesc că ai ElasticSearch rulând pe mașina ta locală, și că localhost este menit să facă referire la aceasta. Dar pentru a rula codul în mediul Cloud Functions, va trebui să ai ElasticSearch rulând pe un sistem care este accesibil public și să specifici IP-ul acelei mașini în uri.

Răspunsul #2

Funcțiile Cloud rulează pe un server controlat de Google. Ele nu rulează pe calculatorul tău (cu excepția cazului în care folosești emulare locală pentru testare).

Funcția dvs. accesează un URL la "localhost":

const searchConfig = {
    uri: 'http://localhost:9200/users/user/' + uid,
    method: 'GET'
};

request(searchConfig).then(...)

În aproape toate contexturile, localhost înseamnă adresa IP 127.0.0.1 - aceeași mașină pe care rulează codul. Când codul tău rulează în Cloud Functions, asta înseamnă că localhost este instanța serverului Google care rulează codul tău. Acesta cu siguranță nu este ceea ce vrei, și din păcate, nu vei putea accesa nici serviciile care rulează pe mașina ta personală.