I am trying to create a login page also same error for register. when I route its shows
,**Cannot GET /api/auth/register]*.I have checked all the possible question answers. I'm having trouble with my server routes. is there any problem with my routes? or problem with code the in browser window.
index.js
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const dotenv = require("dotenv");
const helmet = require("helmet");
const morgan = require("morgan");
const userRoute = require("./routes/users");
const authRoute = require("./routes/auth");
const postRoute = require("./routes/posts");
dotenv.config();
mongoose.connect(
process.env.MONGO_URL,
{ useNewUrlParser: true,
useUnifiedTopology: true
},
() => {
console.log("Connected to MongoDB");
}
);
//middleware
app.use(express.json());
app.use(helmet());
app.use(morgan("common"));
app.use("/api/auth", authRoute);
app.use("/api/users", userRoute);
app.use("/api/posts", postRoute);
app.listen(8000, () => {
console.log("Backend server is running!");
});
my auth.js where login and register exist.
const express = require("express");
const router = express.Router();
const User = require("../models/User");
const bcrypt = require("bcrypt");
//REGISTER
router.post("/register", async (req, res) => {
try {
//generate new password
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(req.body.password, salt);
//create new user
const newUser = new User({
username: req.body.username,
email: req.body.email,
password: hashedPassword,
});
//save user and respond
const user = await newUser.save();
res.status(200).json(user);
} catch (err) {
res.status(500).json(err)
}
});
//LOGIN
router.post("/login", async (req, res) => {
try {
const user = await User.findOne({ email: req.body.email });
!user && res.status(404).json("user not found");
const validPassword = await bcrypt.compare(req.body.password, user.password)
!validPassword && res.status(400).json("wrong password")
res.status(200).json(user)
} catch (err) {
res.status(500).json(err)
}
});
module.exports = router;
CodePudding user response:
The router for login is using POST Method, and if you directly type the URL to the browser, you are sending the GET request to the server, you probably need to download a Postman so you can send a Post request with body.
CodePudding user response:
You directly send get requests from the browser, you can use curl or postman.
In addition to the @honghai answer, you can't send the response like this:
!user && res.status(404).json("user not found");
You need to make these changes.
router.post("/login", async (req, res) => {
try {
const user = await User.findOne({ email: req.body.email });
// make sure user is not empty {} or [];
if (!user) res.status(404).json("user not found");
const validPassword = await bcrypt.compare(req.body.password, user.password)
// make sure password is not empty {} or [];
if(!validPassword) res.status(400).json("wrong password");
res.status(200).json(user)
} catch (err) {
res.status(500).json(err)
}
});
Note: you can use thunderclient, a lighy weight library to test APIs, I recommend using it.
