Путешествие с React Native и NestJS [1 / X]

В этом приключении мы увидим, как создать кулинарную книгу.

Я не теряю времени, рассказывая вам, что такое React Native или NodeJS. Я уверен, что есть много сообщений среднего размера, объясняющих, что это за два. Однако я уверен, что некоторые из вас не знают о NestJS. Надеюсь, вы узнаете что-нибудь от меня, прочитав этот средний пост!

Итак, приступим к делу!

Инициализировать React Native с помощью expo

Прежде всего, что такое экспо? Expo - это своего рода верхний уровень для React Native, предоставляющий библиотеки и инструменты, помогающие разработчикам разрабатывать, создавать и развертывать свои приложения React Native.

Прежде всего убедитесь, что на вашем компьютере установлен узел с версией узла выше 10.0.0. (Вы можете установить его здесь).

Теперь нам нужно установить expo-cli, который позволит нам легко создать проект RN, запустить его локально и опубликовать.

$ npm install -g expo-cli

Затем нам нужно будет запустить наш проект с помощью этой команды:

$ expo init cookbook

expo-cli, задавая вам несколько вопросов:
- 1-й: выберите пустой (TypeScript) проект
- 2-й: введите имя вашего приложения
- 3-й: введите n + enter, чтобы не использовать Пряжа (я очень люблю за это npm)

Примечание. Если команда заблокирована во время «Установка зависимостей…», не паникуйте, вы все равно можете остановить ее с помощью Ctrl + C, удалить ваши node_modules и выполнить npm install.

Теперь вы можете перейти в репозиторий проекта React Native (если вы забыли, как это сделать: $ cd cookbook) и запустить приложение в браузере с помощью:

$ npm run web

Чтобы запустить его в браузере, вам потребуется последняя версия expo-cli, поэтому, если у вас есть журнал такого типа: error: unknown option '--web-only' y, возможно, вам потребуется установить последнюю версию.

Перейдите к localhost:19006, и вы получите это. Поздравляем, вы сделали первую часть!

Источники:
https://facebook.github.io/react-native/docs/0.59/getting-started

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

Запустите свой сервер с помощью NestJS

Инициировать проект NestJS очень просто. Все, что вам нужно сделать, это установить nest-cli и создать новый проект с помощью этих всего двух команд:

$ npm i -g @nestjs/cli
$ nest new project-name

Вам нужно будет ответить на 1 вопрос:
- выберите «npm» (вы знаете почему)

Все, что вам теперь нужно сделать, это запустить свой сервер:

$ cd project-name
$ npm run start

Затем перейдите к localhost:3000, и вы увидите чудесное сообщение «Hello World!» (Как необычно)! Молодец, вы только что завершили вторую часть урока, вы лучший! 👍

Источник: https://docs.nestjs.com/

Отображение HTTP-ответа в вашем приложении React Native

Что ж, у нас есть одно приложение React Native и один сервер, работающие отдельно, давайте заставим их взаимодействовать друг с другом. Все, что мы сейчас хотим сделать, это отобразить исходное сообщение «Hello World!» В нашем приложении React Native.

Для этого нам нужно обновить наш App.tsx. Этот файл является файлом входа для нашего приложения React Native, который обрабатывается сразу после app.json. Мы откопаем эти файлы позже, а пока давайте сосредоточимся на нашем запросе.

Вот так сейчас выглядит наш App.tsx

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
  return (
    <View style={styles.container}>
      <Text>Open up App.tsx to start working on your app!</Text>
    </View>
  );
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

React, как и другие фреймворки Javascript (Angular, VueJS), работает с компонентами (подробнее о компонентах Javascript см. Здесь). У нас есть то, что похоже на HTML. На самом деле это JSX, синтаксис для встраивания XML в JavaScript. Я расскажу о нем в другом посте, но вы все равно можете узнать о нем подробнее здесь. У нас также есть CSS, который мы применяем к JSX.

Перед выполнением нашего HTTP-вызова нам нужно будет изучить жизненный цикл компонента React.

В этой главе мы сосредоточимся на этапах инициализации и монтирования:
• 1-й: React установит свойства и состояния. Свойства похожи на @Input в Angular. Вы передаете свойства от компонента его дочернему элементу и получаете их следующим образом:

constructor(props: any) {
  this.state = { isLoading: true};
}

Состояния используются для хранения данных для вашего текущего компонента, поэтому вам придется использовать this.setState().
• 2nd: componentWillMount() Я почти уверен, что вы понимаете, что каждая строка Javascript, которую вы вставляете в этот метод будет выполнен до того, как React отобразит страницу JSX.
• 3-й: метод render() отобразит JSX-содержимое вашего компонента. Вы можете добавить условия для отображения содержимого JSX или другого (мы увидим это позже), поэтому вы хотите обернуть свой JSX этим методом.
• 4-й: наконец componentDidMount(), как и 2-й, каждая строка кода внутри этого метода будет выполняться после монтирования компонента (после рендеринга).

Итак, прежде всего, давайте сделаем наш класс более похожим на компонент React. Давайте изменим наш App.tsx:

export default class App extends React.Component<IMyComponentProps, IMyComponentState> {
 …
}

Поскольку мы используем Typescript, нам нужно объявить, как выглядят наши объекты prop и state. Итак, над объявлением нашего класса мы добавим это:

interface IMyComponentProps {} // we don’t use props for this case.
interface IMyComponentState {
 isLoading: boolean,
 dataSource?: string
}

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

constructor(props: any) {
 super(props);
 this.state = { isLoading: true};
}

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

render(){
  if(this.state.isLoading){
    return(
      <View style={{flex: 1, padding: 20}}>
        <ActivityIndicator/>
      </View>
    )
  }
  
  return (
    <View style={styles.container}>
      <Text>{this.state.dataSource}</Text>
    </View>
  );
}

Вот как выглядит наш render(), пока мы не получим наш HTTP-ответ, мы будем отображать элемент загрузки <ActivityIndicator/>. Чтобы использовать его, нам нужно импортировать этот элемент из React Native:

import { StyleSheet, Text, View, ActivityIndicator } from 'react-native';

Наконец, мы напишем наш HTTP-вызов в componentDidMount():

componentDidMount(){
  return fetch('http://localhost:3000')
    .then((response) => response.text())
    .then((responseString) => {
      this.setState({
        isLoading: false,
        dataSource: responseString
      });
    })
  .catch((error) =>{
    console.error(error);
  });
}

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

Пока мы получаем наш ответ, который представляет собой строку, мы извлекаем только ядро ​​тела с помощью response.text(). Если ответ был объектом JSON, мы напишем это вместо response.json(). Теперь, когда мы получили ответ HTTP, мы можем установить для isLoading значение false, а значение, которое мы получаем для dataSource, и отображать его в части JSX благодаря привязке данных.

Теперь вы можете перезапустить свой собственный проект реакции с помощью expo start --web или expo start --web-only, чтобы увидеть результат.

Это не то, чего мы ожидали, но мы можем легко это исправить, не волнуйтесь. Проблема здесь в том, что ваш сервер получает запрос с того же IP-адреса, что и он. Это предотвращает необычный запрос. Чтобы избежать такой ошибки, все, что нам нужно сделать, это добавить строку в наш main.ts на вашем сервере NestJS:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  await app.listen(3000);
}
bootstrap();

А теперь перезапустим сервер и перезагрузим страницу:

МЫ ДЕЛАЕМ ЭТО! Я так горжусь тобой !

Здесь полный App.tsx на всякий случай. В следующий раз мы увидим, как отобразить список рецептов в нашем приложении React Native, от создания схемы mongodb, создания класса мангуста и маршрутов на нашем сервере до отображения наших рецептов впереди.

На этом все, спасибо, что прочитали этот пост, надеюсь, он вам помог!