Ошибка в req.user._id, поскольку он возвращает ошибку, которая не может найти идентификатор null - PullRequest
0 голосов
/ 09 июля 2020

req.user._id в router.get ('/ mypost', requireLogin, (req, res)) в post. js возвращает следующую ошибку: -

Cannot read property '_id' of null

at C:\javascript\merntsack_course\server\routes\post.js:36:25

at Layer.handle [as handle_request] 

(C:\javascript\merntsack_course\server\node_modules\express\lib\router\layer.js:95:5)

at next (C:\javascript\merntsack_course\server\node_modules\express\lib\router\route.js:137:13)

at C:\javascript\merntsack_course\server\middleware\requireLogin.js:22:13

at processTicksAndRejections (internal/process/task_queues.js:97:5)

Это это второй раз, когда я получаю сообщение об ошибке относительно идентификатора, пожалуйста, скажите мне, почему это происходит снова и снова и какие исправления мне нужно внести в код, чтобы любой запрос, касающийся идентификатора, не приводил к ошибке. Заранее спасибо . Ниже приведены файлы, которые вызывают наибольшее беспокойство:

post. js: -

const express = require('express')
const router = express.Router()
const mongoose = require('mongoose')
const requireLogin = require('../middleware/requireLogin')
const User = mongoose.model("User")
const Post = mongoose.model("Post")

router.get('/allpost', (req, res) => {

Post.find().populate("postedBy", "_id name").then(posts => {
    res.json({ posts })
}).catch(err => {
    console.log(err)
})
})

router.post('/createpost', requireLogin, (req, res) => {
const { title, body } = req.body
if (!title || !body) {
    return res.status(422).json({ error: "please add all the fields!!" })
}
req.user.password = undefined
const post = new Post({
    title,
    body,
    postedBy: req.user
})
post.save().then(result => {
    res.json({ post: result })
}).catch(err => {
    console.log(err)
})
})

router.get('/mypost', requireLogin ,(req, res) => {
const id = req.user._id
Post.find({postedBy : id}).populate("postedBy", "id name").then(mypost => {
    res.json({ mypost })
}).catch(err => {
    console.log(err)
})
})

module.exports = router

requireLogin. js: -

const jwt = require('jsonwebtoken')
const {JWTSECRET} = require('../keys')
const mongoose = require("mongoose")
const User = mongoose.model("User")

module.exports = (req, res, next) => {

const {authorization} = req.headers
//authorization === Bearer token 
if (!authorization) {
    return res.status(401).json({ error: "you must be logged in" })
}
const token = authorization.replace("Bearer ", "")
jwt.verify(token, JWTSECRET, function(err, payload){
    if (err) {
        return res.status(401).json({ error: "you must be logged in" })
    }

   const id = payload.id
    User.findById(id).then(userdata => {
        req.user = userdata
        next()     
    })
   

})


}

auth. js: -

const express = require('express')
const router = express.Router()
const mongoose = require('mongoose')
const User = mongoose.model("User")
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const {JWTSECRET} = require('../keys')
const requireLogin = require('../middleware/requireLogin')




router.post('/signup', (req, res) => {
const { name, email, password } = req.body
if (!email || !password || !name) {
    return res.status(422).json({ error: " please add all the fields" })
} else {
    User.findOne({ email: email }).then((savedUser) => {
        if (savedUser) {
            return res.status(422).json({ error: " user already exists" })
        }
        bcrypt.hash(password, 12)
            .then(hashedpassword => {
                const user = new User({
                    email,
                    password: hashedpassword,
                    name
                })

                user.save().then(user => {
                    res.json({ message: "saved successfully" })
                }).catch(err => {
                    console.log(err)
                })

            })

    }).catch(err => {
        console.log(err)
    })
}
})

router.post('/signin', (req, res) => {

const { email, password } = req.body
if (!email || !password) {
    return res.status(422).json({ error: " please add all the fields" })
}
User.findOne({ email })
    .then(savedUser => {

        if (!savedUser) {
          return  res.status(422).json({error : "Invalid email or password!!"})
        }
        bcrypt.compare(password , savedUser.password)
            .then(doMatch=>{
                if(doMatch){
                   // res.json({message : "successfully signed in "})

                   const token = jwt.sign({_id : savedUser._id} , JWTSECRET)
                   res.json({token})
                }else{
                    return  res.status(422).json({error : "Invalid email or password!!"})
                }
            })
    }).catch(err=>{
        console.log(err)
    })
})


 module.exports = router

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Вы используете id, чтобы получить пользователя:

 const id = payload.id
    User.findById(id).then(userdata => {

Однако в вашем токене находится _id:

const token = jwt.sign({_id : savedUser._id} , JWTSECRET)

Согласуйте с id или _id и посмотрите, решит ли это проблему.

0 голосов
/ 09 июля 2020

Я думаю, что в вашем сценарии есть опечатка, вы описываете проблему как метод POST router.post, но в своем коде вы используете метод GET router.get, попробуйте исправить это и посмотрите, что произойдет.

...