SERVER
1. package.json
{
"name": "mernapp",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "cd client && npm run build",
"install-client": "cd client && npm install",
"heroku-postbuild": "npm run install-client && npm run build",
"start": "node server.js",
"client": "cd client && npm start",
"dev": "concurrently -n 'server,client' -c 'red,green' \"nodemon server.js\" \"npm run client\""
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.0",
"concurrently": "^5.0.0",
"express": "^4.17.1",
"mongoose": "^5.7.9",
"morgan": "^1.9.1"
},
"devDependencies": {
"nodemon": "^2.0.4"
}
}
2. server.js
// Import npm packages
const express = require('express');
const mongoose = require('mongoose');
const morgan = require('morgan');
const path = require('path');
const app = express();
const PORT = process.env.PORT || 8080; // Step 1
const routes = require('./routes/api');
// Step 2
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/mern_youtube', {
useNewUrlParser: true,
useUnifiedTopology: true
});
mongoose.connection.on('connected', () => {
console.log('Mongoose is connected!!!!');
});
// Data parsing
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// Step 3
if (process.env.NODE_ENV === 'production') {
app.use(express.static('client/build'));
}
// HTTP request logger
app.use(morgan('tiny'));
app.use('/api', routes);
app.listen(PORT, console.log(`Server is starting at ${PORT}`));
3.router/api.js
const express = require('express');
const router = express.Router();
const BlogPost = require('../models/blogPost');
// Routes
router.get('/', (req, res) => {
BlogPost.find({ })
.then((data) => {
//console.log('Data: ', data);
res.json(data);
})
.catch((error) => {
console.log('error: ', daerrorta);
});
});
router.post('/save', (req, res) => {
const data = req.body;
const newBlogPost = new BlogPost(data);
newBlogPost.save((error) => {
if (error) {
res.status(500).json({ msg: 'Sorry, internal server errors' });
return;
}
// BlogPost
return res.json({
msg: 'Your data has been saved!!!!!!'
});
});
});
router.get('/name', (req, res) => {
const data = {
username: 'peterson',
age: 5
};
res.json(data);
});
module.exports = router;
4.models/blogpost.js
const mongoose = require('mongoose');
// Schema
const Schema = mongoose.Schema;
const BlogPostSchema = new Schema({
title: String,
body: String,
date: {
type: String,
default: Date.now()
}
});
// Model
const BlogPost = mongoose.model('BlogPost', BlogPostSchema);
module.exports = BlogPost;
II.CLIENT
1.package.json
{
"name": "client",
"version": "0.1.0",
"private": true,
"dependencies": {
"react": "^16.11.0",
"react-dom": "^16.11.0",
"react-scripts": "3.2.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"proxy": "http://localhost:8080"
}
2.src/app.js
import React from 'react';
import axios from 'axios';
import './App.css';
class App extends React.Component {
state = {
title: '',
body: '',
posts: []
};
componentDidMount = () => {
this.getBlogPost();
};
getBlogPost = () => {
axios.get('/api')
.then((response) => {
const data = response.data;
this.setState({ posts: data });
console.log('Data has been received!!');
})
.catch(() => {
alert('Error retrieving data!!!');
});
}
handleChange = ({ target }) => {
const { name, value } = target;
this.setState({ [name]: value });
};
submit = (event) => {
event.preventDefault();
const payload = {
title: this.state.title,
body: this.state.body
};
axios({
url: '/api/save',
method: 'POST',
data: payload
})
.then(() => {
console.log('Data has been sent to the server');
this.resetUserInputs();
this.getBlogPost();
})
.catch(() => {
console.log('Internal server error');
});;
};
resetUserInputs = () => {
this.setState({
title: '',
body: ''
});
};
displayBlogPost = (posts) => {
if (!posts.length) return null;
return posts.map((post, index) => (
<div key={index} className="blog-post__display">
<h3>{post.title}</h3>
<p>{post.body}</p>
</div>
));
};
render() {
console.log('State: ', this.state);
//JSX
return(
<div className="app">
<h2>Welcome to the best app ever</h2>
<form onSubmit={this.submit}>
<div className="form-input">
<input
type="text"
name="title"
placeholder="Title"
value={this.state.title}
onChange={this.handleChange}
/>
</div>
<div className="form-input">
<textarea
placeholder="body"
name="body"
cols="30"
rows="10"
value={this.state.body}
onChange={this.handleChange}
>
</textarea>
</div>
<button>Submit</button>
</form>
<div className="blog-">
{this.displayBlogPost(this.state.posts)}
</div>
</div>
);
}
}
export default App;
Reference
1. Nodejs – Html – Response
SAWN – Email Verification Complete.rar
https://www.dropbox.com/s/sjtus872omhzr3x/Starter%20Project.rar
https://www.youtube.com/c/CodeWorkr/playlists