Unable to signup once login detail have been entered - node.js

I'm pretty new to React & node.js , and have attempted to create a chat messaging app. However im unable to access the rest of my app as every-time i sign in there is an error stating:
**Uncaught (in promise) Error: Request failed with status code 404
at createError (createError.js:16:1)
at settle (settle.js:17:1)
at XMLHttpRequest.onloadend (xhr.js:66:1)**
Auth.jsx file in client server
import React, {useState} from 'react';
import Cookies from 'universal-cookie';
import axios from 'axios';
import signinImage from '../assets/Group 2.png';
const cookies = new Cookies();
//forming the inital state of input fields
const initialState = {
fullName:'',
username:'',
password:'',
confirmPassword:'',
phoneNumber:'',
avatarURL:'',
}
const Auth = () => {
const [form, setForm] = useState(initialState);
const [isSignup , setIsSignup] = useState(true);
const handleChange = (e) => {
setForm({...form,[e.target.name]: e.target.value});
}
const handleSubmit = async (e)=>{
e.preventDefault();
const {username , password , phoneNumber , avatarURL } = form;
const URL = 'http://localhost:5009/auth'
//making requests to different url backened each time
const {data : { token ,userId , hashedPassword , fullName }} = await axios.post(`${URL}/${isSignup ? 'Sign Up ' : 'Sign In'}`,{
username , password , fullName: form.fullName , phoneNumber , avatarURL,
})
//storing data in cookies
cookies.set('token ' , token )
cookies.set('username ' , username )
cookies.set('fullName' , fullName)
cookies.set('userId ' , userId )
if (isSignup){
cookies.set('phoneNumber' , phoneNumber )
cookies.set('avatarURL' , avatarURL)
cookies.set('hashedPassword' , hashedPassword )
}
//reloads application
window.location.reload();
}
//changing state of my sign up screen depending on the state before
const switchMode = () => {
setIsSignup((prevIsSignup) => !prevIsSignup);
}
return (
<div className=" auth__form-container">
<div className="auth__form-container_fields">
<div className="auth__form-container_fields-content">
<p>{isSignup ? 'Sign up' : 'Sign In'}</p>
<form onSubmit= {handleSubmit}>
{isSignup &&(
<div className= "auth__form-container_fields-content_input">
<label htmlFor="fullName">Full Name</label>
<input
name="fullName"
type="text"
placeHolder= "Full Name"
onChange={handleChange}
required
/>
</div>
) }
<div className= "auth__form-container_fields-content_input">
<label htmlFor="username">Username</label>
<input
name="username"
type="text"
placeHolder= "Username"
onChange={handleChange}
required
/>
</div>
{isSignup &&(
<div className= "auth__form-container_fields-content_input">
<label htmlFor="phoneNumber">Phone Number</label>
<input
name="phoneNumber"
type="text"
placeHolder= "Phone Number"
onChange={handleChange}
required
/>
</div>
) }
{isSignup &&(
<div className= "auth__form-container_fields-content_input">
<label htmlFor="avatarURL">Avatar URL</label>
<input
name="avatarURL"
type="text"
placeHolder= "Avatar URL"
onChange={handleChange}
required
/>
</div>
) }
<div className= "auth__form-container_fields-content_input">
<label htmlFor="password">Password</label>
<input
name="password"
type="password"
placeHolder= "Password"
onChange={handleChange}
required
/>
</div>
{isSignup &&(
<div className= "auth__form-container_fields-content_input">
<label htmlFor="confirmPassword">Confirm Password</label>
<input
name="confirmPassword"
type="password"
placeHolder= "Confirm Password"
onChange={handleChange}
required
/>
</div>
) }
<div className="auth__form-container_fields-content_button">
<button>{isSignup ? "Sign up " : "Sign In"}</button>
</div>
</form>
<div className="auth__form-container_fields-account">
<p>
{isSignup
? "Already have an account?"
:"Dont have an account ?"
}
<span onClick={switchMode}>
{isSignup ? ' Sign In' : ' Sign up'}
</span>
</p>
</div>
</div>
</div>
<div className="auth__form-container_image">
<img src = {signinImage} alt ="Sign In" />
</div>
</div>
)
}
export default Auth
Below is the code for files in my server folder :
index.js
const express = require ('express');
const cors = require ('cors');
//adding routes for sign in + registrationn//
const authRoutes = require("./routes/auth.js");
const app = express ();
const PORT = process.env.PORT || 5009;
require ('dotenv').config();
app.use(cors());
app.use(express.json());
app.use(express.urlencoded());
app.get('/' , (req,res) => {
res.send('ne, world');
});
app.use('/auth', authRoutes);
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
Auth.js file in Controllers folder:
const { connect } = require('getstream');
const bcrypt = require('bcrypt');
const StreamChat = require('stream-chat').StreamChat;
const crypto = require('crypto');
require('dotenv').config();
const api_key = process.env.STREAM_API_KEY;
const api_secret = process.env.STREAM_API_SECRET;
const app_id = process.env.STREAM_APP_ID;
const signup = async (req, res) => {
try {
const { fullName, username, password, phoneNumber } = req.body;
const userId = crypto.randomBytes(16).toString('hex');
const serverClient = connect(api_key, api_secret, app_id);
const hashedPassword = await bcrypt.hash(password, 10);
const token = serverClient.createUserToken(userId);
res.status(200).json({ token, fullName, username, userId, hashedPassword, phoneNumber });
} catch (error) {
console.log(error);
res.status(500).json({ message: error });
}
};
const login = async (req, res) => {
try {
const { username, password } = req.body;
const serverClient = connect(api_key, api_secret, app_id);
const client = StreamChat.getInstance(api_key, api_secret);
const { users } = await client.queryUsers({ name: username });
if(!users.length) return res.status(400).json({ message: 'User not found' });
const success = await bcrypt.compare(password, users[0].hashedPassword);
const token = serverClient.createUserToken(users[0].id);
if(success) {
res.status(200).json({ token, fullName: users[0].fullName, username, userId: users[0].id});
} else {
res.status(500).json({ message: 'Incorrect password' });
}
} catch (error) {ads
console.log(error);
res.status(500).json({ message: error });
}
};
module.exports = { signup, login }
Auth.js file in routes folder
const express = require ('express');
const { signup, login } = require('../controllers/auth.js');
const router = express.Router();
//initialising my 2 different routes //
//post route sending data from frontend to backend
router.post('/signup', signup);
router.post('/login', login);
module.exports = router;
Any thought on what im doing wrong or can implement to change these errors would be much appreciated !

Related

Can't find mistake in my code, I am validating user is logined and has token stored in localstorage, but can;t get back token from localstorage

//Home page in reactJs
import React,{useState, useEffect} from 'react';
import Navbar from './Navbar';
import Footer from './Footer';
import landingpic from '../assets/images/landingpage.jpg';
let my_token;
const Home = () => {
const [userName, setUserName] = useState();
const callHomePage = async() => {
my_token = window.localStorage.getItem(my_token);
console.log(my_token);
const data = await fetch('http://localhost:5000/getdata',{
method:'POST',
headers:{
"Content-Type":"application/json",
'Authorization': "Bearer" + my_token,
},
body:JSON.stringify({my_token})
});
const res = data.json();
setUserName(res.name);
console.log(res.name);
if(!res.status===200 || !res){
const error = new Error(res.error);
throw error;
}
}
useEffect(()=>{
callHomePage();
})
return (
<div>
<Navbar/>
<div className='main_content'>
{/* left side content */}
<div className='main_content_left'>
<p>Online Learning</p>
<h1>Learn EveryDay</h1>
<p>Hey {userName} Great way to learn is by playing games.<br/>Come everyday and play these quiz challanges<br/>and learn with fun</p>
<button>Start Game</button>
</div>
{/* right side content */}
<div className='main_content_right'>
<img src={landingpic} alt="quiztime" className='quizimage' />
</div>
</div>
<Footer/>
</div>
)
}
export default Home
// getdata route
router.post('/getdata',authenticate,(req,res)=>{
res.send(req.user);
});
///authenticate middleware
const jwt = require("jsonwebtoken");
const User = require('../model/userSchema');
const authenticate = async(req,res,next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
console.log(`verified token is ${token}`);
if(token == null){
return res.sendStatus(401);
}
const verifyToken = jwt.verify(token,process.env.SECRET_KEY);
const rootUser = await User.findOne({_id:verifyToken,"tokens.token":token});
if(!rootUser) {throw new Error('User not found')};
req.token=token;
req.rootUser=rootUser;
req.userID=rootUser._id;
next();
}
module.exports = authenticate;
/// login.js frontend file
import React,{useState} from 'react'
import { useNavigate } from 'react-router-dom';
const Login = () => {
const [user,setUser] = useState({email:"",password:""});
const navigate = useNavigate();
let name;
let value;
const handleInputs = (e) =>{
name=e.target.name;
value=e.target.value;
setUser({...user,[name]:value});
}
const postdata = async(e) =>{
e.preventDefault();
const{email,password} = user;
const data = await fetch('http://localhost:5000/signin',{
method:'POST',
headers:{
"Content-Type":"application/json",
},
body:JSON.stringify({
email,password
})
});
const res = await data.json();
if(res.status===422 || !res){
window.alert("Login failed");
}
else{
window.alert("Login Successful");
window.localStorage.setItem("my_token",res.my_token);
navigate('/');
}
}
return (
<div>
<div className='outer_form_div'>
<div className='inner_form_div' style={{height: "60vh"}}>
<div className='form_heading_div'>
<h1>Log In</h1>
<p>Doesn't have an account? <a href='/signup'>Sign Up</a></p>
</div>
<div className='form_div'>
<form method='POST'>
<label>Email</label><br/>
<input type="email" name="email" value={user.email} onChange={handleInputs} autoComplete="off" placeholder="Enter your email"/><br/><br/>
<label>Password</label><br/>
<input type="password" name="password" value={user.password} onChange={handleInputs} autoComplete="off" placeholder="Enter your password"/><br/><br/>
<input type="button" value="Submit" onClick={postdata} className='submitbtn'/>
</form>
</div>
</div>
</div>
</div>
)
}
export default Login
In my this code I am trying to validate that if user is authorized then display its name on home page, the user if has jwt token stored in localStorage it send token through auth. headers to server on route /getdata. The problem is that the token when generated gets stored in localStorage but after when user is redirected to home page the token is sadi to be null. I can't figure out the mistake, please anyone help me with my mistake. It would be a great help.
You are trying to do a .getItem from local storage using the variable you want to store the value of the result as the key.
Try doing something like this instead.
my_token = window.localStorage.getItem("<your storage key>");
https://developer.mozilla.org/en-US/docs/Web/API/Storage/getItem

What did I do wrong when I push database registers to Json-server to users.json. I have 404 not found

I am new to ReactJs coding, I have watched some videos about fake JSON-Server, but I don't know how to post all data from register.js to my "users.json" through "server.js".
What I do is I have an edit "package.json" "script": "auth": "node server.js" and npm i json-server, npm i json-server jsonwebtoken body-parser --save-dew and npm run auth to run server.js
I learn this on youtube...
Here is my source code. Someone can fix my wrong "post", Thank you!
users.json
{
"users": [
{
"id": 1
"username":"admin",
"email": "123#gmail.com",
"phone": "01234",
"pass": "admin1234",
"gender":"female",
"role":"shop"
}
]
}
server.js
const fs = require("fs");
const bodyParser = require("body-parser");
const jsonServer = require("json-server");
const jwt = require("jsonwebtoken");
const server = jsonServer.create();
const userdb = JSON.parse(fs.readFileSync("./database/users.json", "utf-8"));
server.use(bodyParser.urlencoded({extended: true}));
server.use(bodyParser.json());
server.use(jsonServer.defaults());
const SECRET_KEY = "85423112"; //*random key to see access-token
const expiresIn = "1h";
function createToken(payload) {
return jwt.sign(payload, SECRET_KEY, {expiresIn});
}
function isLoginAuthenticated({username, password}) {
return (
userdb.users.findIndex((user) => user.username === username && user.pass === password) !== -1
); ư
}
function isSignupAuthenticated({username}) {
return (
userdb.users.findIndex((user) => user.username === username ) !== -1);}
server.post("api/auth/register", (req,res)=>{
const {username,email,phone,password, gender,role} = req.body;
if(isSignupAuthenticated({username})){
const status = 401;
const message = "Username already taken";
res.status(status).json({status,message}) //*taken err will appeare in web console
return;
}
fs.readFile(".database/users.json", (err, data) => {
if(err){
const status = 401;
const message = "err";
res.status(status).json({status,message}) //*err when read file in system will appeare in web console
return;
}
data = JSON.parser(data.toString());
let last_item_id = data.users[data.user.length - 1].id;
data.users.push({id: last_item_id +1, username:username,email:email,phone: phone, pass:password, gender:gender, role:role });
let writeData = fs.writeFile("./database/users.json", JSON.stringify(data), (err, result)=>{
if (err) {
const status = 401;
const message = "err";
res.status(status).json({status,message})
return;
}
});
});
const access_token = createToken({username,password});
res.status(200).json({access_token}); //* set status to be OKKKKK when create account success =)))
});
server.post("/api/auth/login", (req,res)=>{
const {username,password} = req.body;
if(!isLoginAuthenticated({username,password})){
const status = 401;
const message = "Incorrect Username or Password";
res.status(status).json({status,message}) //*wrong will appeare in web console
return;
}
const access_token = createToken({username,password});
res.status(200).json({access_token}); //* set status to be OKKK when login ok =)))
});
server.listen(5001, ()=>{
console.log("running json api server");
});
Register.js
import React, {useState} from 'react'
import '../styles/Signup.css'
import axiox from "axios";
import {useHistory, Link} from 'react-router-dom'
import VisibilityIcon from '#mui/icons-material/Visibility'
import VisibilityOffIcon from '#mui/icons-material/VisibilityOff'
function Register() {
const [username,setUsername]= useState("");
const [password,setPassword]= useState("");
const [email,setEmail]= useState("");
const [phone,setPhone]= useState("");
const [gender,setGender]= useState("");
const [role,setRole]= useState("");
const [error, setError]= useState("");
let history = useHistory();
const [showPass,setshowPass]= useState(false);
const [showconfirmPass,setshowconfirmPass]= useState(false);
const register = (e) => {
e.preventDefault();
axiox.post("http://localhost:5001/api/auth/register",
{username,
email,
phone,
password,
gender,
role,
}).then((response)=> {
console.log("response", response)
localStorage.setItem("login", JSON.stringify({
userLogin: true,
token: response.data.access_token,
}));
setError("");
setUsername("");
setEmail("");
setPhone("");
setPassword("");
setGender();
setRole();
history.push("/login");
}).catch(error =>setError(error.response.data.message));
};
return (
<div>
<div id="getstarted">Get started</div>
<div id="intro"><span>Sign up</span> to our website and start to explore your unique style today !</div>
<div class="center">
<form onSubmit={register}>
<div class="txt_field">
<input type="text" required
value={username}
onChange={(e)=> setUsername(e.target.value)}/>
<span></span>
<label>Username</label>
</div>
<div class="txt_field">
<input type="text" required
value={email}
onChange={(e)=> setEmail(e.target.value)}/>
<span></span>
<label>Email</label>
</div>
<div class="txt_field">
<input type="text" required
value={phone}
onChange={(e)=> setPhone(e.target.value)}/>
<span></span>
<label>Phone number</label>
</div>
<div class="txt_field">
<input type={showPass ?"text":"password" }required
value={password}
onChange={(e)=> setPassword(e.target.value)}/>
<span></span>
<label>Password</label>
</div>
<div class="password1" onClick={()=>{if(showPass == true){setshowPass(false)}else {setshowPass(true)}}}>
{showPass ? <VisibilityIcon/> : <VisibilityOffIcon/>}
</div>
<div class="txtfield_1">
<input type={showconfirmPass ?"text":"password" } required/>
<span></span>
<label>Confirm Password</label>
</div>
<div class="confirm" onClick={()=>{if(showconfirmPass == true){setshowconfirmPass(false)}else {setshowconfirmPass(true)}}}>
{showconfirmPass ? <VisibilityIcon/> : <VisibilityOffIcon/>}
{error && <p2 style={{
color:"red",
position:"absolute",
top:"580px", width:"500px", left:"15vw"
}}>{error}</p2>}
</div>
<div id="general">
<div class="signup_link">
Already have an account? <Link to="/login">Sign in</Link>
</div>
<input type="submit" value="Learn More"/>
</div>
</form>
</div>
<div id="rightside">
<div id="sex">Sex</div>
<div id="button">
<input type="radio" name="gender" value={gender =="male"} onChange={(e)=> setGender(e.target.value)}/>
<label for="male"></label>
<span>Male</span>
<input type="radio" name="gender" value={gender =="female"} onChange={(e)=> setGender(e.target.value)}/>
<label for="female"></label>
<span>Female</span>
</div>
<div class="rect1">
<button class="button" type="button" value={role == "shop"} onChange={(e)=> setRole(e.target.value)}><img src={process.env.PUBLIC_URL + `/Images/shop 1.png`} /></button>
</div>
<div class="rect2">
<button class="button" type="button" value={ role == "customer"} onChange={(e)=> setRole(e.target.value)}> <img src={process.env.PUBLIC_URL + `/Images/take-away.png`} /></button>
</div>
</div>
</div>
);
}
export default Register
You should change your route from server.post("api/auth/register", (req,res)=>{ to server.post("/api/auth/register", (req,res)=>{ in server.js file

I am getting "POST http://localhost:5000/api/users 400 (Bad Request)" response while using axios.post from action in react

I am using axios.post in my auth action by which I want to post my register detail that I am getting from register component . But I am getting bad request response and with error
"Error: Request failed with status code 400
at createError (createError.js:16)
at settle (settle.js:17)
at XMLHttpRequest.onloadend (xhr.js:66)"
Please find the below code for my Auth action ,Register component and server code for registering users please let me know the mistake that I making here :
//auth action :
import axios from "axios";
import {setAlert} from './alerts';
import {REGISTER_FAIL,REGISTER_SUCCESS} from './types';
// Register User
export const register = ({name,email,password}) => async (dispatch) => {
const headers = {
'Content-Type': 'application/json'
}
const body=JSON.stringify({name,email,password});
console.log(body);
try {
const res = await axios.post('http://localhost:5000/api/users', body, {
headers: headers
})
dispatch({
type: REGISTER_SUCCESS,
payload: res.data
});
} catch (err) {
const errors = err.response.data.errors;
/*
if (errors) {
errors.forEach((error) => dispatch(setAlert(error.msg, 'danger')));
}
*/
console.log(err);
dispatch({
type: REGISTER_FAIL
});
}
};
// , "proxy": "http://localhost:5000"
// Register component
import React from 'react';
import { useState } from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import { setAlert } from '../../actions/alerts';
import { register} from '../../actions/auth';//importing register action
import './../../App.css';
export const Register = (props) => {
const [formData, setFormData] = useState({
name:'',
email:'',
password:'',
password2:''
})
const {name,email,password,password2}={...formData};
const onChange=(e)=>setFormData({...formData,[e.target.name]:e.target.value});
const onSubmit=(e)=>{
e.preventDefault();
if(password!==password2){
props.setAlert('password do not match','danger');
}
else{
props.register({name,email,password});
}
}
return (
<div >
<h1 className="large text-primary">Sign Up</h1>
<p className="lead"><i className="fas fa-user"></i> Create Your Account</p>
<form className="form" onSubmit={e=>onSubmit(e)}>
<div className="form-group">
<input type="text" placeholder="Name"
name="name" value={name}
onChange={e=>onChange(e)}
required />
</div>
<div className="form-group">
<input type="email"
placeholder="Email Address"
name="email" value={email}
onChange={e=>onChange(e)} />
<small className="form-text"
>This site uses Gravatar so if you want a profile image, use a
Gravatar email</small
>
</div>
<div className="form-group">
<input
type="password"
placeholder="Password"
name="password"
value={password}
onChange={e=>onChange(e)}
minLength="6"
/>
</div>
<div className="form-group">
<input
type="password"
placeholder="Confirm Password"
name="password2"
value={password2}
onChange={e=>onChange(e)}
minLength="6"
/>
</div>
<input type="submit" className="btn btn-primary" value="Register" />
</form>
<p className="my-1">
Already have an account? <Link to="/login">Sign In</Link>
</p>
</div>
)
}
export default connect(null,{setAlert,register}) (Register);
Server API code :
const express =require('express');
const User=require('../../models/User');
const gravatar=require('gravatar');
const {check, validationResult}=require('express-validator');
const bcrypt=require('bcryptjs');
const jwt=require('jsonwebtoken');
const router=express.Router();
const config=require('config');
// signin
router.post('/',[
check('name','name is required').not().isEmpty(),
check('email','Need valid email').isEmail(),
check('password','length should be greater than 6').isLength({min:6})
],async(req,res)=>{
const errors=validationResult(req);
if(!errors.isEmpty()){
return res.status(400).json({errors:errors.array()});
}
const {name,email,password}=req.body;
try{
let user= await User.findOne({email});
if(user){
return res.status(400).json({errors:'user already exist !'})
}
const avatar =gravatar.url({email})
user= new User({
name,
email,
password,
avatar
})
const salt=await bcrypt.genSalt(10);
user.password=await bcrypt.hash(password,salt);
await user.save();
const payload={
user:{
id:user.id
}
}
jwt.sign(payload,config.get('jwtsecret'),(err,token)=>{
if(err){
throw err;
}
res.json({token});
})
}
catch(err){
return res.status(400).json({errors:errors.message})
}
});
module.exports=router;

Why did it failed to load? the server responded with a status of 404 (Not Found)

I have my app(express+Next.js.MOngoDB).I signuped all my users,works Ok. Now when I try signin
http://localhost:5000/signin
I got error
Uncaught (in promise) Error: Request failed with status code 404
at createError (webpack-internal:///../../node_modules/axios/lib/core/createError.js:16)
at settle (webpack-internal:///../../node_modules/axios/lib/core/settle.js:17)
Terminal
GET /__nextjs_original-stack-frame?isServerSide=false&file=webpack-internal%3A%2F%2F%2F..%2F..%2
POSTMAN signin works fine
app.js(just API)
const app = express();
app.use('/api/v1/auth', auth);
Next.js,Signin
import SigninComponent from '../components/frontauth/SigninComponent';
const Signin = () => {
return (
<Layout>
<h2 className="text-center pt-3 pb-4">Signin</h2>
<div className="row">
<div className="col-md-6 offset-md-3">
<SigninComponent />
</div>
</div>
</Layout>
);
};
SigninComponent
/* eslint-disable no-undef */
import axios from 'axios';
import React, { useState } from 'react';
import { API } from '../../config';
const SigninComponent = () => {
const [values, setValues] = useState({
email: '',
password: ''
});
const [loading, setLoading] = useState(false);
const { email, password } = values;
const handleSubmit = async (e) => {
e.preventDefault();
const { email, password } = values;
const user = { email, password};
await axios.post(`${API}/api/v1/auth/signin`, user);
};
const handleChange = name => e => {
setValues({ ...values, error: false, [name]: e.target.value });
};
const showLoading = () => (loading ? <div className="alert alert-info">Loading...</div> : '');
const signinForm = () => {
return (
<form onSubmit={handleSubmit}>
<div className="form-group">
<input
value={values.email}
onChange={handleChange('email')}
type="email"
className="form-control"
placeholder="Type your email"
/>
</div>
<div className="form-group">
<input
value={values.password}
onChange={handleChange('password')}
type="password"
className="form-control"
placeholder="Type your password"
/>
</div>
<div>
<button className="btn btn-primary">Signin</button>
</div>
</form>
);
};
return <React.Fragment>
{showLoading()}
{signinForm()}
</React.Fragment>;
};
export default SigninComponent;
How should I edit .babelrc,I have only one line,should I add plugins?
"presets": ["next/babel"]
Why does the terminal point to SSR FALSE?

Password hashing not working on Put request

Using bcryptjs library and got 2 issues when performing Put request:
1- On insomnia / postman, server returns hashed password, but it returns "unhashed" on client side inspect console tools.
2- I can not perform a login with new password credential.
Any visible syntax mistake on server code or quick suggestions please? Tks!
CLIENT SIDE CODE:
function DevUpdateForm() {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [techs, setTechs] = useState("");
async function updateUser(e) {
e.preventDefault()
const dataUpdate = { name, email, password, techs}
const response = await api.put(`/devs/${dev._id}`, dataUpdate);
console.log(response);
setName('');
setEmail('');
setPassword('');
setTechs([]);
}
return (
<div className="update-profile">
<strong>Alterar</strong>
<img src={dev.avatar_url} alt={dev.name}/>
<form onSubmit={updateUser} >
<div className="input-block">
<label htmlFor="name">Nome:</label>
<input
name="name"
id="name"
type="text"
placeholder={"Alterar nome"}
value={name}
onChange={e => setName(e.target.value)}
/>
</div>
<div className="input-block">
<label htmlFor="email">E-mail:</label>
<input
name="email"
id="email"
type="text"
placeholder={"Alterar email"}
value={email}
onChange={e => setEmail(e.target.value)}
/>
</div>
<div className="input-block">
<label htmlFor="password">Senha:</label>
<input
name="password"
id="password"
type="password"
placeholder={"Digite nova senha"}
value={password}
onChange={e => setPassword(e.target.value)}
/>
</div>
<div className="input-block">
<label htmlFor="techs">Techs:</label>
<input
name="techs"
id="techs"
type="text"
placeholder={"Alterar tecnologias"}
value={techs}
onChange={e => setTechs(e.target.value)}
/>
</div>
<button type="submit" >Salvar</button>
</form>
</div>
)
}
export default DevUpdateForm;
SERVER SIDE UPDATE CONTROLLER:
async update(req, res, next) {
try {
const { name, email, password, techs } = req.body;
const { _id } = req.params;
const techsArray = parseStringAsArray(techs);
let dev = await Dev.findByIdAndUpdate(_id, {
name,
email,
password,
techs: techsArray
},
{new: true});
dev = await Dev.findById(_id)
dev.password = await bcrypt.hash(dev.password, 8)
if (dev !== null) {
res.status(200).send({
data: dev,
message: "Dev has been updated!"
});
} else {
res.status(404).end();
}
} catch (error) {
next(error)
}
},
ROUTE:
routes.put('/devs/:_id', DevController.allowIfLoggedin, DevController.grantAccess('updateAny', 'profile'), DevController.update);
After finding the model and set new values to user model. you have to execute .save() statement to update existing changes.
async update(req, res, next) {
try {
const { name, email, password, techs } = req.body;
const { _id } = req.params;
const techsArray = parseStringAsArray(techs);
let dev = await Dev.findByIdAndUpdate(_id, {
name,
email,
password,
techs: techsArray
},
{new: true});
dev = await Dev.findById(_id)
dev.password = await bcrypt.hash(dev.password, 8)
dev.save();// add this to save new password
if (dev !== null) {
res.status(200).send({
data: dev,
message: "Dev has been updated!"
});
} else {
res.status(404).end();
}
} catch (error) {
next(error)
}
},

Resources