Проблемы с соединением между двумя экземплярами Google Compute Engine - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над веб-приложением с Go и Javascript.Я также использую Google Compute Engine для обслуживания своего приложения.У меня есть 3 виртуальных машины, одна для моей базы данных, для внешнего интерфейса и последняя для внутреннего.У меня нет проблем с восстановлением данных из моей БД с помощью Go, но когда я пытаюсь отправить данные из Go в Javascript, я получаю это сообщение об ошибке

GET http://10.132.0.3/ 0 ()    (index):10
    callGoServer    @   (index):10
    onclick @   (index):15

Uncaught (in promise) TypeError: Failed to fetch    (index):1 
    Promise.then (async)        
    callGoServer    @   (index):12
    onclick @   (index):15

Вот мой код Go

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "log"
    "net/http"

    _ "github.com/lib/pq"
)

//Quote is a quote
type Quote struct {
    ID     int `json:"id"`
    Phrase string `json:"phrase"`
    Author string `json:"author"`
}

var db *sql.DB

func init() {
    var err error
    db, err = sql.Open("postgres", "postgres://postgres:password@10.132.0.2:5432/quotes?sslmode=disable")
    if err != nil {
        panic(err)
    }

    if err = db.Ping(); err != nil {
        panic(err)
    }
    fmt.Println("You connected to your database")
}

func getQuotes(w http.ResponseWriter, r *http.Request) {

    if r.Method != "GET" {
        http.Error(w, http.StatusText(405), http.StatusMethodNotAllowed)
        return
    }

    rows, err := db.Query("SELECT id, phrase, author FROM citations ORDER BY RANDOM() LIMIT 1;")
    if err != nil {
        http.Error(w, http.StatusText(500), 500)
        return
    }
    defer rows.Close()

    quotations := make([]Quote, 0)
    for rows.Next() {
        qt := Quote{}
        err := rows.Scan(&qt.ID, &qt.Phrase, &qt.Author)
        if err != nil {
            panic(err)
        }
        quotations = append(quotations, qt)
    }
    if err = rows.Err(); err != nil {
        panic(err)
    }

    for _, qt := range quotations {
        payload, _ := json.Marshal(qt)
        w.Header().Add("Content-Type", "application/json")
        w.Write(payload)
    }
}

func main() {
    router:= mux.NewRouter()
    router.HandleFunc("/", getQuotes)
    log.Fatal(http.ListenAndServe(":8080",handlers.CORS(handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"}),handlers.AllowedMethods([]string{"GET","POST","PUT","DELETE"}),handlers.AllowedOrigins([]string{"*"}))(router)))
}

Вот мой код JS

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Random quote</title>
    </head>
    <body>
        <script type="text/javascript" language="javascript">
            function callGoServer(){
                fetch('http://10.132.0.3')
                    .then(response => response.json())
                    .then(json => console.log(json))
            }
        </script>
        <button onclick="callGoServer()">Click here</button>
    </body>
</html>

Я создал правило брандмауэра на GCP, которое разрешает протокол TCP между моей виртуальной машиной через порт 5432 (postgresql) и 8080 (мой ходсервер)

Кто-нибудь может мне помочь?

Спасибо

1 Ответ

0 голосов
/ 12 сентября 2018

Ваша виртуальная машина имеет только частный IP-адрес . Нет доступа к этому из вашего браузера. Вам нужно назначить публичный IP-адрес для вашей виртуальной машины и использовать его вместо этого.


Как только это будет исправлено, вам все равно нужно будет сделать запрос на правильный порт. Вы прослушиваете порт 8080, но в своем запросе вы не указываете порт, поэтому он использует http-порт по умолчанию (80).

Измените ваш запрос на

function callGoServer(){
  fetch('http://10.132.0.3:8080')
    .then(response => response.json())
    .then(json => console.log(json))
}

или вместо этого прослушивайте порт 80.

...