0

My routes: routes/users.js

const express = require('express');
const router = express.Router();
const usersController = require("../controllers/usersController")
const auth = require("../utils/auth")

router.post("/register", usersController.registerUser)
router.post("/login", usersController.loginUser)
router.get("/:id", usersController.getUser)
router.get("/list", usersController.listUsers)
router.post("/edit/:id", usersController.updateUser)
router.delete("/delete/:id", usersController.deleteUser)

module.exports = router;

My Controller: usersController.js

const User = require("../models/User")
const auth = require("../utils/auth")
const validator = require("validator")


module.exports = {

    registerUser: (req, res, next) => {
        console.log("register controller")
        const { username, email, password } = req.body
        User.create(req.body, (err, createdUser) => {
            if (err) {
                return next(err)
            } else if (!username || !email || !password) {
                return res.status(400).json({ message: "Username, email and password are must" })
            } else if (!validator.isEmail(email)) {
                return res.status(400).json({ message: "Invaid email" })
            } else if (password.length < 6) {
                return res.status(400).json({ message: "Password should be of at least 6 characters" })
            }
            else {
                return res.status(200).json({ user: createdUser })
            }
        })
    },

    loginUser: (req, res, next) => {
        console.log("login controller")
        const { email, password } = req.body
        if (!email || !password) {
            return res.status(400).json({ message: "Email and password are must" })
        }

        User.findOne({ email }, (err, user) => {
            if (err) {
                return next(err)
            } else if (!validator.isEmail(email)) {
                return res.status(400).json({ message: "Invalid email" })
            } else if (!user) {
                return res.status(402).json({ error: "User not found" })
            } else if (!user.confirmPassword(password)) {
                return res.status(402).json({ error: "Incorrect password" })
            }

            // generate token here
            const token = auth.signToken(email)
            res.status(200).json({ user, token })
            // next()
        })
    },

    getUser: (req, res, next) => {
        User.findById(req.params.id, (err, user) => {
            if (err) {
                return next(err)
            } else if (!user) {
                return res.status(404).json({ message: "User not found" })
            } else {
                return res.status(200).json({ user: user })
            }
        })
        next()
    },

    listUsers: (req, res) => {
        console.log("inside listUsers")
        User.find({}, (err, users) => {
            if (err) {
                return res.status(404).json({ error: "No users found" })
            } else {
                return res.status(200).json({ users: users })
            }
        })
    },

    updateUser: (req, res) => {
        console.log("update user")
        console.log(req.params.id)
        User.findByIdAndUpdate(req.params.id, (err, updateduser) => {
            if (err) {
                return res.status(404).json({ error: "No user found" })
            } else {
                return res.status(200).json({ user: updateduser })
            }
        })
    },

    deleteUser: (req, res, next) => {
        console.log("delete user")
        User.findByIdAndDelete(req.params.id, (err, deleteduser) => {
            if (err) {
                return res.status(400).json({ error: "No user found" })
            } else {
                return res.status(200).json({ user: deleteduser })
            }
        })
    }
}

I am not able to delete, update and get the list of all users. When I do a GET request to get the list of users, it says,

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

With PUT and DELETE I'm simply getting a 404 error. My User model has username, email, and password fields only.

Endpoint urls:

localhost:3000/api/v1/users/list

localhost:3000/api/v1/users/edit/5e29ea8dbcd4cc141224b966

localhost:3000/api/v1/users/delete/5e29ea8dbcd4cc141224b966

The error I'm getting on listUsers:

inside listUsers
GET /api/v1/users/list 500 34.833 ms - 1757
events.js:174
      throw er; // Unhandled 'error' event
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (/home/asus/Desktop/myApp/node_modules/express/lib/response.js:767:10)
    at ServerResponse.send (/home/asus/Desktop/myApp/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/home/asus/Desktop/myApp/node_modules/express/lib/response.js:267:15)
    at User.find (/home/asus/Desktop/myApp/controllers/usersController.js:80:40)
    at /home/asus/Desktop/myApp/node_modules/mongoose/lib/model.js:4784:16
    at /home/asus/Desktop/myApp/node_modules/mongoose/lib/query.js:4389:12
    at process.nextTick (/home/asus/Desktop/myApp/node_modules/mongoose/lib/helpers/query/completeMany.js:35:39)
    at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
    at /home/asus/Desktop/myApp/node_modules/mongoose/lib/model.js:4786:13
    at /home/asus/Desktop/myApp/node_modules/mongoose/lib/query.js:4389:12
    at process.nextTick (/home/asus/Desktop/myApp/node_modules/mongoose/lib/helpers/query/completeMany.js:35:39)
    at process._tickCallback (internal/process/next_tick.js:61:11)
Community
  • 1
  • 1
akhildhiman
  • 642
  • 9
  • 23
  • https://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent-to-the-client this answer might help – manask322 Jan 24 '20 at 05:27
  • You send headers 2 or more times to client , check if any of your middlewares are sending headers . – pkoulianos Jan 24 '20 at 05:30

1 Answers1

0

Try to debug your list users router with the above code:

listUsers: (req, res) => {
        console.log("inside listUsers")
        User.find({}, (err, data) => {
            if (err) {
                console.log(err.message)
            } 
            console.log(data)

        })
pkoulianos
  • 177
  • 2
  • 5
  • I'm getting the data- an array of objects of all users. But there's 500 error on this route. Plus, not console logging err.message. Also, ERR_HTTP_HEADERS_SENT is still there. – akhildhiman Jan 24 '20 at 06:04
  • @metalHeadDev i update the code snipet , i remove the req.send commands . Try it again , maybe you have a middleware that is sending headers . – pkoulianos Jan 24 '20 at 06:14
  • I had to remove next(), and now it's working. I don't know why? – akhildhiman Jan 24 '20 at 12:08