Рубрики
Без рубрики

Начало работы с угловой и поехать – настройка проекта котельной.

Как и угла и иди, я решил создать проект котельной для углового / реагирования + Go написать об этом.

Автор оригинала: Anshul Sanghi.

Я видел много людей в группах в социальных сетях, спрашивая, есть ли проект котельной, присутствующий для угловой/реакции + GO. Как то угловой, так и увлекательнее себя, я решил создать один.

Проект, который я создал, можно найти здесь Отказ В этом посте мы посмотрим, как я создал его, чтобы вы могли понять, как он работает и настроить его, если хотите. Текущая котельная предлагает очень базовую настройку. Я буду работать над улучшением его в ближайшее время.

Обратите внимание, что эта котельная не считает, что подают угловое приложение с сервера. Эта настройка обрабатывает сервер Go и угловое приложение в виде двух отдельных объектов и помогает только в управлении их совместными или управлять своими зависимостями. С этой настройкой вы можете запустить каждый из них отдельно, если вам нужно, без каких-либо изменений.

Как уже упоминалось в Readme Github Repo, на сегодняшний день котельная только хорошая для целей развития. Вам все равно придется вручную построить клиентов и серверов вручную, а также модифицируя некоторые настройки (вы увидите их позже) вручную. Я работаю над автоматическим, но это займет некоторое время. В любом случае, давайте погрузимся в это.

Настройка клиента (угловой)

Предпосылки:

  1. У вас есть угловые CLI и NPM.

Во-первых, генерируйте новый угловой проект в папке SRC в вашем GoPath или любой подпасной папке SRC. Вы можете сделать это, открывая терминал в этой папке и запущении:

ng new your-awesome-project

Это будет генерировать новый угловой проект и будет устанавливать все зависимости для вас. Это это для клиентской стороны на данный момент.

Настройка сервера (GO)

Предпосылки:

  1. Вы пошли установлены.
  2. У вас есть Gohome и Gopath правильно настройки.

Во-первых, запустите следующее в терминале, чтобы установить джин.

go get github.com/codegangsta/gin

GIN – это утилита для перезарядки для перезарядки для серверов Go, которые автоматически создают и управляет сервером на изменениях в файлах .go. Это очень похоже на DEV WebPack Server – разница, являющаяся не только автоматически обновлять браузер и только восстановит сервер. Вам придется обновить браузер вручную, если вы обновите свой код сервера.

Далее мы собираемся установить еще два пакета GO: https://github.com/gorilla/mux обрабатывать маршрутизацию и https://github.com/rs kors Для обработки запросов по пересечению происхождения.

CORS означает общий ресурс по пересечению происхождения. Поскольку наш клиент и сервер будут работать на разных портах и в конечном итоге на разных доменах, позволяя просить запросы CORS от одного домена в другое должно быть явно настроен.

Для меня лучшее место, чтобы поставить весь мой серверный код, находится в папке, называемом сервером, внутри папки SRC в проекте, сгенерированном угловым CLI. Теперь три папки, с которыми мы будем работать, есть приложение , среда и сервер.

Давайте сначала настроим простой сервер Go и забыть о CORS на мгновение. Для простого сервера создайте файл под названием main.go Отказ Код в этом файле будет выглядеть что-то подобное:

package main

import (
  "github.com/gorilla/mux"
  "net/http"
  "os"
  "log"
  "your-awesome-project/src/server/utils"
)

func main() {
  r := mux.NewRouter()

  r.HandleFunc("/hello-world", helloWorld)

  http.Handle("/", r)

  srv := &http.Server{
    Handler: r,
    Addr:    ":" + os.Getenv("PORT"),
  }

  log.Fatal(srv.ListenAndServe())
}

func helloWorld(w http.ResponseWriter, r *http.Request) {
  var data = struct {
    Title string `json:"title"`
  }{
    Title: "Golang + Angular Starter Kit",
  }

  jsonBytes, err := utils.StructToJSON(data); if err != nil {
    fmt.Print(err)
  }

  w.Header().Set("Content-Type", "application/json")
  w.Write(jsonBytes)
  return
}

Подожди, почему мы выбираем ADDR Из переменных окружающей среды ОС запустите наш сервер в Localhost? Это необходимое требование для Джина работать должным образом. Джин автоматически устанавливает порт (по умолчанию 3000), который вы можете измениться во время работы Gin.

Вы также можете заметить, что я также импортировал локальный пакет под названием Utils. В папке этого пакета есть файл под названием json.go Отказ Это будет содержать функции, которые будут обрабатывать все действия, связанные с json, такие как кодирование и декодирование. С целью этого поста нам понадобится только кодирование JSON. Вот какой код в json.go выглядит как:

package utils

import (
  "encoding/json"
  "bytes"
)

func StructToJSON (data interface{}) ([]byte, error) {
  buf := new(bytes.Buffer)

  if err := json.NewEncoder(buf).Encode(data); err != nil {
    return nil, err
  }

  return buf.Bytes(), nil
}

Эта функция по существу создает новый буфер, который передается как аргумент для json.newencoder () Способ записи данных.

Буфер – это буфер из переменного размера байтов с методами чтения и записи. Нулевое значение для буфера – это пустой буфер, готовый к использованию.

Данные закодированные JSON записаны на этот новый буфер и могут быть прочитаны как [] байт или как строка Использование методов присутствующих на типе Буфер Отказ В этом случае мы возвращаем закодированные данные как [] байт Поскольку нам нужны кодированные данные в этом формате, чтобы иметь возможность записать его в нашем заголовке ответа.

Если вы запутались о том, почему тип аргумента для функции Structtojson имеет тип Интерфейс {} Или также известен как «пустой интерфейс», то же самое, что тип любой в типографии.

Теперь нам нужно выполнить способ для нашего клиента и сервера, чтобы запустить вместе и следить за изменениями, без необходимости выполнения этого процесса вручную. Я нашел простой способ сделать это.

Во-первых, создайте файл под названием Случай .sh В корне вашей папки проекта (в этом случае ваша-потрясающая папка проекта). Содержимое этого файла следующим образом:

#!/bin/sh

ng serve &
gin --port 4201 --path . --build ./src/server/ --i --all &

wait

Хорошо, так что происходит? Если вы нуб в сценарии Bash, позвольте мне сказать вам, что это делает (я на самом деле оглянулся, пока не нашел этого – я не хорошо в сценарии Bash – спасибо Google!). Первая строка похожа на В том смысле, что он также определяет тип этого файла. Двигаясь, следующие две линии – это просто то, что вы бы запускали с терминала.

NG служить Запускает сервер WebPack Dev для угловых, а Джин --пор 4201 - Path. --build ./src/server/--i Отказ от утилиты Live Reveroad для Go Server на порту 4201, ищет изменения файлов в каталоге SRC, создает двоичный файл из ./src/server каталог и перезагружает сервер сразу после изменения файла. Для получения дополнительной информации о флагах, используемых Джином, посетите документы здесь Отказ

Вы можете в очереди столько команд, сколько вы хотели бы запустить, просто добавив & характер как суффикс к ним. В конце концов, линия, содержащая Подожди Таким местом, когда команды в очереди будут выполняться параллельно (да, параллельно, поэтому мы нуждались в том, чтобы мы были нужны сценарию Bash) и будем ждать всех их, чтобы закончить, что не произойдет, пока мы не ударим Ctrl + C в этом случае.

Другое преимущество (или невыгодное положение, возможно,?) Запуск серверов. Это то, что выход консоли для WebPack, так и Go Server будет напечатан в одной и той же консоли, из которой выполняется скрипт.

До того, как скрипт может быть выполнен, мы должны изменить его разрешения и сделать его исполняемым. Просто запустить Chmod 775 ./serve.sh В корневой папке (где присутствует файл SH), чтобы сделать его исполняемым.

В последний шаг, чтобы запустить его через NPM, просто отредактируйте Package.json файл. Под объектом скриптов отредактируйте значение Начать Ключ и сделай это “./serve.sh.” Как только это сделано, просто запустите NPM начать Одновременно раскрутит как серверы развития угнта и Go.

Теперь, когда у нас есть код на месте для начала наших серверов, давайте подключим их и проверим его. Во-первых, давайте установим базовый URL нашего сервера в средах, чтобы мы могли получить доступ к нему из любого места в нашем угловом приложении. Обновление окружающая среда Файл будет выглядеть так:

export const environment = {
  production: false,
  serverUrl: 'http://localhost:4201'
};

Теперь давайте создадим услугу, которая сделает запрос на наш сервер GO.

ng g s hello-world

Простая реализация будет выглядеть что-то подобное:

import { Injectable } from '@angular/core';
import {Http} from '@angular/http';
import {environment} from '../environments/environment';
import 'rxjs/add/operator/map';

@Injectable()
export class HelloWorldService {

  constructor(private http: Http) { }

  getTitle() {
    return this.http.get(`${environment.serverUrl}/hello-world`)
      .map(response => response.json());
  }

}

В нашем App.comPonent.ts мы можем использовать эту услугу для получения заголовка с нашего сервера. Модифицированный файл будет выглядеть что-то подобное:

import {Component, OnInit} from '@angular/core';
import {HelloWorldService} from './hello-world.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {

  title;

  constructor(private hw: HelloWorldService) {}

  ngOnInit() {
    this.hw.getTitle()
      .subscribe(data => this.title = data.title);

    console.log(this.title);
  }

}

Перед запуском приложения не забудьте добавить нашу новую услугу в список поставщиков, а также импорт Httpmodule Отказ

Время для проверки нашего приложения. Хит NPM начать от терминала, чтобы раскрутить серверы. Как только Go, и серверы WebPack работают, посетите http://localhost: 4200 в вашем браузере. Название будет пусто. Любое предположение почему? Корс! Вот что вы увидите в консоли:

Failed to load http://localhost:4201/hello-world: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

Это проблема, о которой я говорил ранее. Давайте реализуем CORS Пакет, который мы загрузили ранее и исправить эту проблему. Обновлено main.go Файл будет выглядеть так:

package main

import (
  "github.com/gorilla/mux"
  "net/http"
  "os"
  "log"
  "angular-go-boilerplate/src/server/utils"
  "fmt"
  "github.com/rs/cors"
)

func main() {
  r := mux.NewRouter()

  r.HandleFunc("/hello-world", helloWorld)

  // Solves Cross Origin Access Issue
  c := cors.New(cors.Options{
    AllowedOrigins: []string{"http://localhost:4200"},
  })
  handler := c.Handler(r)

  srv := &http.Server{
    Handler: handler,
    Addr:    ":" + os.Getenv("PORT"),
  }

  log.Fatal(srv.ListenAndServe())
}

func helloWorld(w http.ResponseWriter, r *http.Request) {
  var data = struct {
    Title string `json:"title"`
  }{
    Title: "Golang + Angular Starter Kit",
  }

  jsonBytes, err := utils.StructToJson(data); if err != nil {
    fmt.Print(err)
  }

  w.Header().Set("Content-Type", "application/json")
  w.Write(jsonBytes)
  return
}

В Cors.options Структура, вы можете установить все домены, которые вы хотите разрешить пересеченные запросы о происхождении. В нашем случае это будет только один домен, и это http://localhost: 4200 Отказ Это все, что нам нужно. Вы также поймете, что сервер Go автоматически перезагружается, и вам просто нужно обновить браузер.

Примечание: Помните, что я упомянул ранее, что для производства настроится, вам придется вручную изменить несколько настроек. Это один из этих настроек. Я работаю над автоматическим устройством и обновит репо, а также в ближайшее время.

Вуаля! Мы сделали это. Наш стартовый проект для работы на Go + угловые проекты теперь завершен.

Управление зависимостями

Теперь давайте посмотрим, как нам проще поделиться кодом без возобновления зависимостей. Все, что вам нужно сделать, это в Package.json Файл, под скриптами: добавьте новую запись, имеющую ключ Установка-зависимости со значением NPM Install install && go github.com/codegsta/gin && get ./src/server/... Отказ Теперь вы и другие вкладчики могут просто установить все зависимости как для угловых, так и для работы NPM запустить установочные зависимости Отказ

Это все на сегодня. Я действительно надеюсь, что некоторые из вас нашли это полезным для ваших собственных проектов. Если у вас есть какие-либо предложения по улучшению котельной или этого поста, дайте мне знать.

Если вы нашли это полезным, оставьте хлопок и поделитесь этим с кем-то, кому это нужно. Следуйте за обновлениями, касающимися этого проекта и нескольких других, которые я планирую работать над.

Ваше здоровье!