简体   繁体   中英

React JS fetch data from api

Why i can't post data to api my booking? the error code is index.js:40 POST https://gotravel-production.up.railway.app/api/v1/booking 401

this my login page code:

import React, { useState, useEffect } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import Container from "react-bootstrap/Container";
import NavbarHeader from "../Header/Navbars";
import { Navigate } from "react-router-dom";
import { GoogleLogin, GoogleOAuthProvider } from "@react-oauth/google";
import jwtDecode from "jwt-decode";

async function doLogin({ username, password }) {
  // Gunakan endpoint-mu sendiri
  const response = await fetch(
    "https://gotravel-production.up.railway.app/api/v1/login",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        username,
        password,
      }),
    }
  );
  const data = await response.json();
  return data.token;
}

async function doLoginGoogle(res, email) {
  // Gunakan endpoint-mu sendiri
  const response = await fetch(
    "https://gotravel-production.up.railway.app/api/v1/google",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        email,
        token: res,
      }),
    }
  );
  const data = await response.json();
  console.log(data);
  return data.accessToken;
}

function Login() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  const [error, setError] = useState("");
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const [isLoading, setIsLoading] = useState(false);
  const token = localStorage.getItem("token");
  const GOOGLECLIENTID =
    "1075166577960-u21r9932mfr51s1uiq3mbc5v5k15uu96.apps.googleusercontent.com";

  useEffect(() => {
    setIsLoggedIn(!!token);
  }, [token]);

  function handleSubmit(e) {
    setIsLoading(true);
    e.preventDefault();
    doLogin({ username, password })
      .then((user) => {
        if (!user) {
          setError(user.message);
        } else {
          localStorage.setItem("token", user);
        }
      })
      .catch((err) => err.message)
      .finally(() => setIsLoading(false));
  }

  const haldleSuccessGoogle = (response) => {
    const userData = jwtDecode(response.credential);
    // const response = await fetch("https://challenge-8-be-fsw-production.up.railway.app/api/v1/google"
    if (response.credential) {
      doLoginGoogle(response.credential, userData.email)
        .then((token) => {
          if (!token) {
            setError("TOKEN TIDAK ADA");
          } else {
            localStorage.setItem("token", token);
            setIsLoggedIn(token);
          }
        })
        .catch((err) => err.message)
        .finally(() => setIsLoading(false));
    }
  };

  // function handleLogout(e) {
  //   setIsLoading(true);
  //   e.preventDefault();
  //   localStorage.removeItem("token");
  //   setIsLoggedIn(false);
  //   setIsLoading(false);
  // }

  return (
    <div className="bgLogin">
      <NavbarHeader />
      <br />
      <br />
      <Container>
        <div className="row">
          <div className="col-7"></div>
          {!isLoggedIn ? (
            <div className="col-5">
              <h2>Masuk</h2>
              <p>
                Belum punya akun? <a href="/register">Daftar disini</a>
              </p>
              <form onSubmit={handleSubmit}>
                <div className="mb-3 h6">
                  <label htmlFor="username" className="form-label">
                    Username
                  </label>
                  <input
                    type="text"
                    className="form-control bg-transparent formInput"
                    id="username"
                    onChange={(e) => setUsername(e.target.value)}
                    value={username}
                    placeholder="your username"
                  />
                </div>
                <div className="mb-3 h6">
                  <label htmlFor="passwd" className="col-sm-2 col-form-label">
                    Password
                  </label>
                  <input
                    type="password"
                    className="form-control bg-transparent formInput"
                    id="password"
                    onChange={(e) => setPassword(e.target.value)}
                    value={password}
                    placeholder="your password"
                  />
                </div>
                <a href="/" className="forgot">
                  Back to the site
                </a>
                <br />
                <br />
                <div className="d-grid gap-2">
                  <input
                    type="submit"
                    value={isLoading ? "Loading" : "Login"}
                  />
                </div>
                <p>Atau masuk dengan</p>
                <div className="d-grid gap-2">
                  <GoogleOAuthProvider clientId={GOOGLECLIENTID}>
                    <GoogleLogin
                      buttonText="Login with Google"
                      onSuccess={(res) => {
                        haldleSuccessGoogle(res);
                      }}
                      onError={() => {
                        haldleSuccessGoogle("Error");
                      }}
                      cookiePolicy={"single_host_origin"}
                    />
                  </GoogleOAuthProvider>
                </div>
              </form>
            </div>
          ) : (
            <Navigate to="/" />
          )}
        </div>
      </Container>
    </div>
  );
}

export default Login;

and this is my booking page code:

import React, { useEffect, useState } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import Header from "../Header";
import Footer from "../Footer";
import { Container } from "react-bootstrap";
import { useLocation } from "react-router-dom";
import { Link } from "react-router-dom";

const BayarTiket = () => {
  const location = useLocation();
  const dataBooking = location.state;
  console.log(dataBooking);
  const [flight, setflight] = useState([]);
  const [user, setUser] = useState([]);

  useEffect(() => {
    fetch("https://gotravel-production.up.railway.app/api/v1/flight")
      .then((response) => response.json())
      .then((data) => {
        setflight(data.data.flights);
        console.log(data.data.flights);
      })
      .catch((err) => {
        console.log("err", err);
      });
    fetch("https://gotravel-production.up.railway.app/api/v1/profile")
      .then((response) => response.json())
      .then((data) => {
        setUser(data);
        console.log(data);
      })
      .catch((err) => {
        console.log("err", err);
      });
  }, []);
  console.log(user);

  async function booking() {
    // Gunakan endpoint-mu sendiri
    const response = await fetch(
      "https://gotravel-production.up.railway.app/api/v1/booking",
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          id_flight: `${dataBooking.data.item.id_plane}`,
          baggage: `${dataBooking.baggageWeight}`,
          food: `${dataBooking.typeFood}`,
          name: `${dataBooking.name}`,
          homephone: `${dataBooking.homePhone}`,
          mobilephone: `${dataBooking.mobilePhone}`,
          totalprice: `${dataBooking.data.item.price}`,
        }),
      }
    );
    const data = await response.json();
    return data;
  }
  return (
    <div className="bayarTiket">
      <Header />
      <Container>
        <div className="row" style={{ paddingTop: "10px" }}>
          <div className="col-lg-12" key={dataBooking.data.item.id}>
            <nav
              className="navbar navbar-expand-lg"
              style={{ backgroundColor: "#4E4E4E" }}
            >
              <div className="container-fluid row">
                <div className="col-lg-7">
                  <a
                    className="navbar-brand"
                    href="#/"
                    style={{ color: "#FFFFFF" }}
                  >
                    Booking
                  </a>
                </div>
                <div className="col-lg-2">
                  <a
                    href="#/"
                    className="nav-link"
                    style={{ color: "#FFFFFF" }}
                  >
                    Pilih Tiket
                  </a>
                </div>
                <div className="col-lg-2">
                  <a
                    href="#/"
                    className="nav-link"
                    style={{ color: "#FFFFFF" }}
                  >
                    Pesanan Tiket
                  </a>
                </div>
                <div className="col-lg-2">
                  <a
                    href="#/"
                    className="nav-link active"
                    style={{ color: "#FFFFFF" }}
                  >
                    Bayar
                  </a>
                </div>
              </div>
            </nav>
            <h2 style={{ marginTop: "40px" }}>
              <img
                src="assets/img/park-tickets-couple 1.png"
                alt="tiket"
                style={{ paddingRight: "15px" }}
              />
              Metode Pengiriman
            </h2>
            <section style={{ marginLeft: "60px", paddingLeft: "15px" }}>
              <h3>Tiket Elektronik</h3>
              <p>
                Inilah cara hemat waktu dan tanpa kertas untuk bepergian. Anda
                akan menerima referensi tiket elektronik melalui e-mail.
              </p>
              <p>{dataBooking.data.item.id_plane}</p>
              <p>{dataBooking.data.available_seats}</p>
              <p>{dataBooking.baggageWeight}</p>
              <p>{dataBooking.typeFood}</p>
              <p>{dataBooking.name}</p>
              <p>{dataBooking.homePhone}</p>
              <p>{dataBooking.mobilePhone}</p>
              <p>{dataBooking.data.item.price}</p>
            </section>
            <h2 style={{ paddingTop: "20px" }}>
              <img
                src="assets/img/card.png"
                alt=""
                style={{ paddingRight: "15px" }}
              />
              Pembayaran
            </h2>
            <div
              style={{
                textAlign: "center",
                width: "1050px",
                height: "70px",
                marginLeft: "70px",
                backgroundColor: "#9f9f9f",
                borderRadius: "8px",
              }}
              className="tbayar"
            >
              <p style={{ paddingTop: "20px" }}>
                Jumlah yang harus di bayar adalah IDR{" "}
                {dataBooking.data.item.price * dataBooking.data.dataForm.capacity}
              </p>
            </div>
            <section style={{ marginLeft: "60px", paddingLeft: "15px" }}>
              <h3>Pembayaran Online</h3>
              <p>
                Pembayaran Online Anda akan dialihkan ke halaman eksternal bila
                mengklik tombol Konfirmasi perjalanan. Metode pembayaran yang
                tersedia antara lain:
              </p>
              <ul>
                <li>
                  <p>Internet Banking</p>
                </li>
                <li>
                  <p>Kartu Kredit (Visa, Master, JCB)</p>
                </li>
                <li>
                  <p>Kartu Debit</p>
                </li>
              </ul>
            </section>
            <button
              className="btn_bayar"
              onClick={booking}
              style={{
                borderRadius: "26px",
                width: "250px",
                height: "50px",
                marginLeft: "450px",
                color: "#ffff",
              }}
            >
              Bayar
            </button>
          </div>
        </div>
      </Container>
      <br />
      <br />
      <Footer />
    </div>
  );
};

export default BayarTiket;

idk why my token is not readable. Help me master

idk why my token is not readable. Help me master idk why my token is not readable. Help me master idk why my token is not readable. Help me master idk why my token is not readable. Help me master idk why my token is not readable. Help me master idk why my token is not readable. Help me master

idk why my token is not readable. Help me master

idk why my token is not readable. Help me master

idk why my token is not readable. Help me master

idk why my token is not readable. Help me master

idk why my token is not readable. Help me master

idk why my token is not readable. Help me master

In your Login, localStorage.getItem is asynchronous and will be "undefined" if you don't await the the results. You can replace the line:

const token = localStorage.getItem("token");

...with:

const [token, setToken] = useState(null);
(async () => {
const result = await localStorage.getItem("token");
setToken(result);
})();

I am not sure that this is your only issue, but this should retrieve "token" from Local Storage if it is there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM