Подключение React Native к бэк-энду (с помощью Express)

Я создал пользовательский интерфейс с React Native, а также скребком Cheerio.js (с Cron Job, чтобы активировать его один раз в день), который я буду использовать для получения определенных данных из Интернета, чтобы они могли отображаться в пользовательском интерфейсе. Тем не менее, я понятия не имею, как связать их обоих.

Я почти уверен, что смогу сделать это с помощью Express (что мне больше всего удобно для серверной части), но может ли кто-нибудь сказать мне точно, что мне нужно сделать, чтобы подключить мой интерфейс к серверной части?

На всякий случай, я младший разработчик (лучше на переднем конце, чем на заднем плане), поэтому, пожалуйста, оставьте ваши ответы простыми. Даже если ваши ответы скорее концептуальные, нежели основанные на коде, я был бы очень признателен.

2 ответа

Решение

Предполагая, что вы общаетесь с API, созданным с помощью Express, используйте fetch как описано в документации: https://facebook.github.io/react-native/docs/network.html

API

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

Учебники

Я думаю, что я не мог объяснить это лучше, чем этот учебник (с примером на Github): https://medium.com/react-native-training/react-native-with-apollo-server-and-client-part-1-efb7d15d2361

https://medium.com/react-native-training/react-native-with-apollo-part-2-apollo-client-8b4ad4915cf5

И следуя руководству Стивена Грайдера по Udemy для более глубокого понимания GraphQL. Он использует React, а не React Native в своем уроке, но синтаксис остается очень близким. https://www.udemy.com/graphql-with-react-course/learn/v4/overview

Важное замечание - в первых руководствах используется "apollo-server", а в руководстве udemy - graphql. Apollo-сервер меняется довольно часто, и GraphQL может быть более понятным.

пример

Вот как выглядит мой мост между двумя. Самой большой трудностью была работа с Cors для внешней версии приложения (Next.js) и выяснение того, что доступ к серверу можно получить по http://10.0.3.2:8080/graphql (может отличаться) вместо localhost:8080.

Мой index.android.js (на стороне клиента):

import React from 'react'
import { AppRegistry } from 'react-native'
import App from './app'

import ApolloClient, { createNetworkInterface } from 'apollo-client';
import { ApolloProvider } from 'react-apollo'

const Client = () => {
  const networkInterface = createNetworkInterface({
   uri: 'http://10.0.3.2:8080/graphql'
  })
  const client = new ApolloClient({
    networkInterface
  });
  return (
    <ApolloProvider client={client}>
      <App />
    </ApolloProvider>)
}

AppRegistry.registerComponent('apolloclient', () => Client);

Мой сервер app.js

const express = require('express');
// const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const cors = require('cors');
const chalk = require('chalk');

// New imports
// NEVER FORGET to require the models,
// in which schemas are registered for a certain model
// forgetting it would throw "Schema hasn't been registered for model..."
const models = require('./models');
const expressGraphQL = require('express-graphql');
const schema = require('./schema/schema');

const app = express();

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

// My mongoLab URI
const MONGO_URI = 'mongodb://xxx:xxx@xxx.mlab.com:xxx/xxx';

// mongoose's built in promise library is deprecated, replace it with ES2015 Promise
mongoose.Promise = global.Promise;

// Connect to the mongoDB instance and log a message
// on success or failure
mongoose.connect(MONGO_URI);
mongoose.connection.once('open', () => console.log(`${chalk.blue(`  Connected to MongoLab instance `)}`));
mongoose.connection.on('error', error => console.log(`${chalk.yellow(`⚠  Error connecting to MongoLab: ` + error + ` ⚠`)}`));

app.use(cors());

// We pass the schema as an option to our expressGraphQL middleware
app.use('/graphql', expressGraphQL({
  schema,
  graphiql: true
}))

module.exports = app;

мой index.js (на стороне сервера):

const app = require('./app');
const chalk = require('chalk');

const PORT = 8080;

app.listen(PORT, () => {
  console.log(`${chalk.green(`✔  Server started on http://localhost:${PORT} ✔`)}`);
});
Другие вопросы по тегам