简体   繁体   中英

Node.JS Express Route results in 404 Only For a Specific Route

I'm having trouble with my node.js express routes. I'm really new and can't see my mistake. I've also read similar threads on Stackoverflow but still haven't managed to solve this problem. Maybe someone can help spot the error.

I've created 4 routes: home-routes.js, user-routes, tech-routes.js, and user-auth.js . Only user-auth.js routes keep getting 404 error when sending a request to http://localhost:8001/api/auth or http://localhost:8001/api/auth/

This is my server.js

const mongoose = require('mongoose');
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);

const express = require('express');
const router = express.Router();

const { func } = require('joi');
const Joi = require('joi');
const helmet = require('helmet')
const morgan = require('morgan')
const config = require('config');
const debug = require('debug')('app:startup');


const home_routes = require('./api/routes/home-routes');
const technology_routes = require('./api/routes/tech-routes');
const user_routes = require('./api/routes/user-routes');
const user_auth = require('./api/routes/user-auth');

// ======================================
//              APP-CONFIG
// ======================================
const app = express();
const port = process.env.PORT || 8001;
const connection_url = `mongodb+srv://${username}:${password}@cluster0.zmc6p.mongodb.net/upss-db?retryWrites=true&w=majority`


// ======================================
//              DB CONFIG
// ======================================
mongoose.connect(connection_url)
    .then(() => console.log('Connected to MongoDB...'))
    .catch(err => console.error('Could not connect to MongoDB...', err));

// ======================================
//              MIDDLE-WARES
// ======================================

app.use(express.json());
app.use(express.urlencoded({ extended: true })); //parse url key=value to json
app.use(express.static('public')); //static assets inside folder 'public'
app.use(helmet());


// ======================================
//         API-ENDPOINTS-PREFIX
// ======================================
app.use('/', home_routes);
app.use('/api/tech', technology_routes);
app.use('/api/user', user_routes);
app.use('./api/auth', user_auth);

//Capture All 404 errors
app.use(function (req, res, next) {
    res.status(404).send('Unable to find the requested resource!');
});


// ======================================
//              LISTENERS
// ======================================

app.listen(port, () => console.log(`Listening on localhost Port ${port}...`));

And this is the user-auth.js

const mongoose = require('mongoose');
const express = require('express');
const router = express.Router();
const _ = require('lodash');
const bcrypt = require('bcrypt');

const { User } = require('../models/user-schema');


router.get('/', (req, res) => {
    res.status(200).send("GET ALL TECHS");
});


// ======================================
//              POST REQUEST
// ======================================

/* CREATE ONE NEW USER */

router.post('/', async (req, res) => {
    const { error } = validateEmailPassword(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    // The user with this email is not found in the DB
    let user = await User.findOne({ email: req.body.email });
    if (!user) return res.status(400).send('Invalid email or password!');

    // Password does not match with our DB
    const validPassword = await bcrypt.compare(req.body.password, user.password);
    if (!validPassword) return res.status(400).send('Invalid email or password!');

    res.send(true);

});


function validateEmailPassword(req) {
    const validationSchema = Joi.object({
        email: Joi.string().min(5).max(255).required().email(),
        password: Joi.string().min(5).max(255).required()
    });
    return validationSchema.validate(req);
}

module.exports = router;

Another route like the one in user-routes.js works fine.

const mongoose = require('mongoose');
const express = require('express');
const router = express.Router();
const _ = require('lodash');
const bcrypt = require('bcrypt');

const { User, validateUser } = require('../models/user-schema');


router.get('/', (req, res) => {
    res.status(200).send("GET ALL USERS");
});



/* CREATE ONE NEW USER */

router.post('/', async (req, res) => {
    const { error } = validateUser(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    // Make sure the user not already registered
    let user = await User.findOne({ email: req.body.email });
    if (user) return res.status(400).send('User already registered!');
    user = new User(_.pick(req.body, ['firstName', 'lastName', 'email', 'password']));
    const salt = await bcrypt.genSalt(10);
    user.password = await bcrypt.hash(user.password, salt);
    await user.save();


    res.send(_.pick(user, ['_id', 'firstName', 'lastName', 'email']));

});



module.exports = router;

Perhaps you want

app.use('/api/auth', user_auth);

not

app.use('./api/auth', user_auth);

in your server.js file as it seems to be a typo issue.

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