aditya kumar
aditya kumar

Reputation: 3023

TypeError: Cannot read property 'email' of undefined in nodejs

I am trying to make api using nodejs. Here i am making signup routes for api but the problem is every time i try to register user it says this. Here is the whole error i am getting.

TypeError: Cannot read property 'email' of undefined

TypeError: Cannot read property 'email' of undefined
    at C:/projects/blog-mern/backend/src/routes/users.js:7:13
    at Layer.handle [as handle_request] (C:\projects\blog-mern\backend\node_modu
les\express\lib\router\layer.js:95:5)
    at next (C:\projects\blog-mern\backend\node_modules\express\lib\router\route
.js:137:13)
    at Route.dispatch (C:\projects\blog-mern\backend\node_modules\express\lib\ro
uter\route.js:112:3)
    at Layer.handle [as handle_request] (C:\projects\blog-mern\backend\node_modu
les\express\lib\router\layer.js:95:5)
    at C:\projects\blog-mern\backend\node_modules\express\lib\router\index.js:28
1:22
    at Function.process_params (C:\projects\blog-mern\backend\node_modules\expre
ss\lib\router\index.js:335:12)
    at next (C:\projects\blog-mern\backend\node_modules\express\lib\router\index
.js:275:10)
    at Function.handle (C:\projects\blog-mern\backend\node_modules\express\lib\r
outer\index.js:174:3)
    at router (C:\projects\blog-mern\backend\node_modules\express\lib\router\ind
ex.js:47:12)
    at Layer.handle [as handle_request] (C:\projects\blog-mern\backend\node_modu
les\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\projects\blog-mern\backend\node_modules\express\lib\route
r\index.js:317:13)
    at C:\projects\blog-mern\backend\node_modules\express\lib\router\index.js:28
4:7
    at Function.process_params (C:\projects\blog-mern\backend\node_modules\expre
ss\lib\router\index.js:335:12)
    at next (C:\projects\blog-mern\backend\node_modules\express\lib\router\index
.js:275:10)
    at C:\projects\blog-mern\backend\node_modules\body-parser\lib\read.js:130:5

This is my code

models/users.js

import mongoose from 'mongoose';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

const schema = new mongoose.Schema({
    email: {
        type: String,
        required: true
    },
    passwordHash: {
        type: String,
        required: true
    }
}, {
    timestamps: true
});

schema.methods.setPassword = function setPassword(password) {
    this.passwordHash = bcrypt.hashSync(password, 10)
}

schema.methods.generateJWT = function generateJWT() {
    return jwt.sign({
        email: this.email,
    }, 'secret')
}

schema.methods.toAuthJSON = function toAuthJSON() {
    return {
        email: this.email,
        token: this.generateJWT()
    }
}

export default mongoose.model('User', schema);

routes/users.js

import express from 'express';
import User from '../models/User';

const router = express.Router();

router.post('/', (req, res, next) => {
    const { email, password } = req.body.users;
    const user = new User({ email });
    user.setPassword(password);
    user.save().then(userRecord => {
        res.json({user: userRecord.toAuthJSON()})
    }).catch(err => {
        res.status(500).json({
            error: err
        })
    })
})

export default router;

i am sending request using postman parmas detail

Upvotes: 0

Views: 2237

Answers (1)

1565986223
1565986223

Reputation: 6718

The problem with your code is you're trying to read users key from req.body which does not exist. Your origin req object does not contain users.

If you console.log(req.body), the req.body will look exactly like your request:

{
  email: "[email protected]"
  passwordHash: "12345"
}

Change your code to:

const { email, passwordHash } = req.body;
const user = new User({ email });

Upvotes: 2

Related Questions