Sådan distribueres en MERN-applikation til Heroku ved hjælp af MongoDB Atlas
Introduktion til MERN
I denne artikel bygger vi og implementerer en applikation, der er bygget med MERN-stakken til Heroku.
MERN, som står for MongoDB, Express, React og Node.js, er en populær tech stack, der bruges til at opbygge webapplikationer. Det involverer frontend-arbejde (med React), backend-arbejde (med Express og NodeJS) og en database (med MongoDB).
Heroku er derimod en platform som en tjeneste (PaaS), der gør det muligt for udviklere at opbygge, køre og betjene applikationer helt i skyen.
Til databasen bruger vi MongoDB Atlas, som er en global cloud-databasetjeneste til moderne applikationer. Dette er mere sikkert end MongoDB installeret lokalt på vores server, og det giver os også plads til flere ressourcer på vores servere.
Til frontend bygger vi en simpel React-app, der fremsætter POST-anmodninger til en API for at tilføje en bruger, og kan også foretage GET-anmodninger for at få alle brugere.
Du kan springe til ethvert trin med indholdsfortegnelsen, der er angivet nedenfor.
Indholdsfortegnelse
- Introduktion til MERN
- Lad os begynde at bygge
- Opbygning af React-appen
- Oprettelse af backend
- Tilslut MongoDB Atlas Database
- Opkald til API'er på frontend
- Implementering til Heroku
- Opret en Heroku-app
- Konfigurer package.json
- Pak ind
Lad os begynde at bygge
Opbygning af React-appen
Bemærk: Før vi begynder med vores projekt, node
skal det være installeret på din computer. node
giver os også npm
, som bruges til installation af pakker.
Installere create-react-app
create-react-app
bruges til at oprette en starter React-app.
Hvis du ikke har create-react-app
installeret, skal du skrive følgende i kommandolinjen:
npm i create-react-app -g
Den -g
flaget installerer pakken globalt.
Opret projektmappen
create-react-app my-project cd my-project
Ovenstående opretter en mappe 'mit-projekt' og installerer afhængigheder, der vil blive brugt i React-startappen. Når installationen er færdig, skifter den anden kommando til projektmappen.
Start appen, og foretag de nødvendige ændringer
npm start
Kommandoen ovenfor starter React-applikationen, som giver dig en URL, hvor du får vist projektet. Du kan derefter foretage nødvendige redigeringer som at ændre billeder eller tekst.
Installer aksios
npm i axios --save
axios
er et JavaScript-bibliotek, der bruges til at gøre HTTP-anmodninger lettere. Det bruges til at sende anmodninger fra frontend (React) til API'erne leveret af backend.
Oprettelse af backend
Backend'en administrerer API'erne, håndterer anmodninger og opretter også forbindelse til databasen.
Installer backend-pakkerne
npm i express cors mongoose body-parser --save
express
: "Express er en minimal og fleksibel ramme til Node.js-webapplikation, der giver et robust sæt funktioner til webapplikationer" - Express Documentationcors
: "CORS er en node.js-pakke til levering af en Connect / Express middleware, der kan bruges til at aktivere CORS med forskellige muligheder" - cors Documentationmongoose
: "Mongoose er et MongoDB-objektmodelleringsværktøj designet til at arbejde i et asynkront miljø. Mongoose understøtter både løfter og tilbagekald" - Mongoose Documentationbody-parser
: "Node.js body parsing middleware." - body-parser-dokumentation
Opret backend-mappen
mkdir backend cd backend
Konfigurer backend
Opret et indgangspunkt server.js
Opret først en server.js
fil, der vil være indgangsstedet for backend.
touch server.js
I server.js
skrive følgende:
const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); const path = require('path') const app = express(); require('./database'); ----- app.use(bodyParser.json()); app.use(cors()); ----- // API const users = require('/api/users'); app.use('/api/users', users); ----- app.use(express.static(path.join(__dirname, '../build'))) app.get('*', (req, res) => { res.sendFile(path.join(__dirname, '../build')) }) ----- const port = process.env.PORT || 5000; app.listen(port, () => { console.log(`Server started on port ${port}`); });
express.static
leverer statiske filer, der er dem, der er bygget, når de npm run build
køres på et React-projekt. Husk, den indbyggede fil er i buildmappen.
Fra vores konfiguration sendes enhver anmodning sendt /api/users
til users
API, som vi er ved at konfigurere.
Konfigurer users
API
mkdir api touch api/users.js
I api/users.js
tilføj følgende:
const express = require('express'); const router = express.Router() ----- const User = require('../models/User'); ----- router.get('/', (req, res) => { User.find() .then(users => res.json(users)) .catch(err => console.log(err)) }) ----- router.post('/', (req, res) => { const { name, email } = req.body; const newUser = new User({ name: name, email: email }) newUser.save() .then(() => res.json({ message: "Created account successfully" })) .catch(err => res.status(400).json({ "error": err, "message": "Error creating account" })) }) module.exports = router
I koden ovenfor opretter vi en GET- og POST-anmodningshåndterer, der henter alle brugere og stiller brugere. Hentning og tilføjelse af en bruger til databasen understøttes af den User
model, vi opretter.
Opret User
model
mkdir models touch models/user.js
I models/user.js
tilføj følgende:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; ----- const userSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true } }) module.exports = mongoose.model("User", userSchema, "users")
I koden ovenfor oprettes et skema for brugeren, der indeholder brugerens felter. I slutningen af filen eksporteres modellen ("Bruger") med skemaet og samlingen ("brugere").
Tilslut MongoDB Atlas Database
Ifølge dokumenterne er "MongoDB Atlas den globale cloud-databasetjeneste til moderne applikationer."
Først skal vi registrere på Mongo cloud. Gå gennem denne dokumentation for at oprette en Atlas-konto og oprette din klynge.
En ting, der er værd at bemærke, er hvidlisting af din forbindelses IP-adresse . Hvis du ignorerer dette trin, har du ikke adgang til klyngen, så vær opmærksom på dette trin.
Klyngen er en lille server, der administrerer vores samlinger (svarer til tabeller i SQL-databaser). For at forbinde din backend til klyngen skal du oprette en fil database.js
, som du kan se er påkrævet i server.js
. Indtast derefter følgende:
const mongoose = require('mongoose'); const connection = "mongodb+srv://username:@/?retryWrites=true&w=majority"; mongoose.connect(connection,{ useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false}) .then(() => console.log("Database Connected Successfully")) .catch(err => console.log(err));
I connection
variablen skal du indtaste din username
(for MongoDB-sky), din password
(klyngeadgangskode), din cluster
(adresse til din klynge) og database
(navnet på din database). Alle disse kan let opdages, hvis du fulgte dokumentationen.
Opkald til API'er på frontend
Alle API'er vil være tilgængelige localhost:5000
lokalt, ligesom vi konfigurerede i server.js
. Når distribueres til Heroku, bruger serveren den port, der leveres af serveren ( process.env.PORT
).
For at gøre tingene lettere tillader React os at specificere en proxy, som anmodningerne sendes til.
Åbn package.json
og lige før den sidste krøllede bøjle, tilføj følgende:
"proxy": "//localhost:5000"
På denne måde kan vi sende anmodninger direkte til api/users
. Og når vores websted implementeres og bygges, bruges standardporten til vores applikation med den samme API.
Open App.js
for React and add the following:
import React, {useState, useEffect} from 'react' import axios from 'axios'; ----- const App = function () { const [users, setUsers] = useState(null); const [username, setUsername] = useState(""); const [email, setEmail] = useState(""); useEffect(() => { axios .get("/api/users") .then((users) => setUsers(users)) .catch((err) => console.log(err)); }, []); function submitForm() { if (username === "") { alert("Please fill the username field"); return; } if (email === "") { alert("Please fill the email field"); return; } axios .post("/api/users", { username: username, email: email, }) .then(function () { alert("Account created successfully"); window.location.reload(); }) .catch(function () { alert("Could not creat account. Please try again"); }); } return ( My Project
{users === null ? ( Loading...
) : users.length === 0 ? ( No user available
) : ( Available Users
{users.map((user, index) => (
- Name: {user.name} - Email: {user.email}
))}
)} setUsername(e.target.value)} type="text" placeholder="Enter your username" /> setEmail(e.target.value)} type="text" placeholder="Enter your email address" /> ); }; export default App
The useState
and useEffect
hooks are used to handle state and sideEffects
. What is basically happening is that the first state of users is null
and 'Loading...' is showed in the browser.
In useEffect
, []
is used to specify that at the componentDidMount
stage (when the component is mounted), make an Axios request to the API which is running on localhost:5000
. If it gets the result and there is no user, 'No user available' is displayed. Otherwise a numbered list of the users is displayed.
If you want to learn more about useState
and useEffect
, check out this article - What the heck is React Hooks?
With the form available, a POST request can be made to post a new user. The state of the inputs are controlled and sent to the API at localhost:5000
on submission. Afterwards, the page is refreshed and the new user is displayed.
Deploying to Heroku
To deploy your application to Heroku, you must have a Heroku account.
Go to their page to create an account. Then go through their documention on how to create a Heroku app. Also check out the documentation on Heroku CLI.
Create a Heroku App
First, login to Heroku:
heroku login
This will redirect you to a URL in the browser where you can log in. Once you're finished you can continue in the terminal.
In the same React project directory, run the following:
heroku create
This will create a Heroku application and also give you the URL to access the application.
Configure package.json
Heroku uses your package.json file to know which scripts to run and which dependencies to install for your project to run successfully.
In your package.json
file, add the following:
{ ... "scripts": { ... "start": "node backend/server.js", "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install npm && run build" }, ... "engines": { "node": "10.16.0" } }
Heroku runs a post build, which as you can see installs your dependencies and runs a build of your React project. Then it starts your project with the start
script which basically starts your server. After that, your project should work fine.
engines
specifies the versions of engines like node
and npm
to install.
Push to Heroku
git push heroku master
This pushes your code to Heroku. Remember to include unnecessary files in .gitignore
.
After few seconds your site will be ready. If there are any errors, you can check your terminal or go to your dashboard in the browser to view the build logs.
Nu kan du se et eksempel på dit websted på den URL, Heroku sendte, da du løb heroku create
.
Det er alt der er ved det. Glad for at du læste så langt.
Pak ind
Der er selvfølgelig mere til MERN-stack-applikationer.
Denne artikel gik ikke så dybt som godkendelser, login, sessioner og alt det der. Det dækkede bare, hvordan man implementerer MERN-stack-applikationer til Heroku og arbejder med MongoDB Atlas.
Du kan finde andre artikler som denne på min blog - dillionmegida.com
Tak for læsningen.