Home > Blockchain >  Exporting Multiple Objects Stops My HTML Requests from being processed
Exporting Multiple Objects Stops My HTML Requests from being processed

Time:03-06

I have some simple javascript code in three files. There is my server.js, which has

const userRouter = require('./routes/users')

app.use("/",userRouter)

Then there is my middleware users.js with

module.exports = router

and lastly user.js with

module.exports = {
    User:User,
    validateLogin:validateUserLogin,
    validateRegister:validateUserRegister,
}

When my user.js had just the export line module.exports = User my code worked just fine. server.js imports users.js, which imports user.js. But when exporting functions along with my User object, my requests stop working. Why? How can I fix this? I'm using Node.js with express and mongo db. All my HTML requests are in users.js.

The code to my server.js is

const express = require('express');
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
//just show server is running

const app = express()
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
const PORT = 4000;

app.get("/status", async (req, res) => {
    return res.status(400).send("server for GET is running");
});

app.post("/status", async (req, res) => {
    return res.status(200).send({
        status: "server for POST is running",
        message: req.body.message
    });
});

app.listen(PORT, function() {
    console.log(`server running on port ${PORT}`);
});

const url = "mongodb srv://Admin:[email protected]/ConfusedTom?retryWrites=true&w=majority"
mongoose.connect(url, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    dbName: "ConfusedTom"
}).then(() => {
    console.log("connected successfully to server, using database %s\n", mongoose.connection.$dbName);
}).catch(err => {
    console.log(err);
});

const userRouter = require('./routes/users')

app.use("/",userRouter)

and here is my users.js

const mongoose = require("mongoose");
const express = require("express");
const router = express.Router();
const ObjectId = mongoose.Types.ObjectId;
const Review = require("../models/review.js")
const TVShow = require("../models/tvshows.js")

const { User, validateLogin, validateRegister} = require("../models/user.js")

router.get("/username", async (req, res) => {
    console.log("reached!")
    var user = await User.findOne({ username: req.body.username });
    if (!user) return res.status(400).send("User doesn't exist.");
    return res.status(200).send(user)
});

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

    else user = await User.findOne({ username: req.body.username });
    if (user) return res.status(400).send("Username already taken.");
    //create new user
    user = new User({
        firstName: req.body.firstName,
        lastName: req.body.lastName,
        username: req.body.username,
        password: req.body.password,
    });
    user.save();
    return res.status(200).send("User registered successfully.");
})

router.post("/login", async (req, res) => {
    console.log("reached!")
    // validate the request body first
    const { error } = validateLogin(req.body);
    if (error) return res.status(400).send(error.details[0].message);
    //find an existing user
    var user = await User.findOne({ username: req.body.username });
    if (!user) return res.status(400).send("Username reqired.");
    if (user) {
        if (user.validatePassword(req.body.password)) {
            return res.header.status(200).send("User login successfully");
        }
        else return res.status(400).send("Password is incorrect");
    } else return res.status(400).send("User doesn't exist.");
});

module.exports = router

CodePudding user response:

The problem with your updated import of the stuff from user.js is you're using the wrong names for the functions. You currently have:

const UserStuff = require("../models/user.js")
const User = UserStuff.User;
const validateLogin = UserStuff.validateUserLogin;
const validateregister = UserStuff.validateUserRegister;

but the object you're exporting is:

module.exports = {
    User:User,
    validateLogin:validateUserLogin,
    validateRegister:validateUserRegister,
}

You're using the wrong names of the functions (validateUserLogin instead of validateLogin). The names you use have to match at both ends. So:

const UserStuff = require("../models/user.js")
const User = UserStuff.User;
const validateLogin = UserStuff.validateLogin;
//                              ^^^^^^^^^^^^^
const validateregister = UserStuff.validateRegister;
//                                 ^^^^^^^^^^^^^^^^

or more concisely:

const { User, validateLogin, validateRegister} = require("../models/user.js")
  • Related