Проблемы с сохранением нового сообщения, используя mon goose и node / express - PullRequest
0 голосов
/ 23 января 2020

Я хочу сохранить новый пост в MongoDB, используя Mon goose и Node / Express. Для меня это недостающий элемент, чтобы начать работу над сайтом блога с помощью Node.

Я делюсь кодом от

' маршруты ': сообщения, verifyToken и auth модели : сообщение, пользователь

ОШИБКА происходит, когда я пытаюсь использовать маршрут сообщений для публикации.

{
    "errors": {
        "owner": {
            "stringValue": "\"{ iat: 1579749217 }\"",
            "kind": "ObjectID",
            "value": {
                "iat": 1579749217
            },
            "path": "owner",
            "reason": {
                "stringValue": "\"{ iat: 1579749217 }\"",
                "kind": "ObjectId",
                "value": {
                    "iat": 1579749217
                },
                "path": "owner",
                "reason": {},
                "message": "Cast to ObjectId failed for value \"{ iat: 1579749217 }\" at path \"owner\"",
                "name": "CastError"
            },
            "message": "Cast to ObjectID failed for value \"{ iat: 1579749217 }\" at path \"owner\"",
            "name": "CastError"
        }
    },
    "_message": "Post validation failed",
    "message": "Post validation failed: owner: Cast to ObjectID failed for value \"{ iat: 1579749217 }\" at path \"owner\"",
    "name": "ValidationError"
}

сообщений. js

const router = require('express').Router();
const Post = require('../models/Post');
const verify = require('./verifyToken');

router.post('/', verify, async (req, res) => {
    const post = new Post({
        title: "FIRST TITLE",
        desc: "FIRST DESCRIPTION",
        owner: req.user
    })
    try {
        const newPost = await post.save();
        res.status(201).send(newPost);
    } catch(err) {
        res.send(err);
    }
})

module.exports = router;

auth. js

const router = require('express').Router();
const User = require('../models/User');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const {registerValidation, loginValidation} = require('../validation');

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

    const emailExists =  await User.findOne({email: req.body.email});
    if(emailExists) return res.status(400).send('Email already exists!');

    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(req.body.password, salt);

    const user = new User({
        name: req.body.name, email: req.body.email, password: hashedPassword
    })

    try {
        const newUser = await user.save();
        res.json(newUser);
    } catch(err) {
        res.json({message:err})
    }
})

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

    const user = await User.findOne({email: req.body.email});
    if (!user) return res.status(400).send("email does not exist");

    const validPassword = await bcrypt.compare(req.body.password, user.password);
    if(!validPassword) return res.status(400).send("password is incorrect");

    const token = jwt.sign({_id: req.body._id}, process.env.TOKEN_SECRET);
    res.header('auth-token', token).send(token);
})

module.exports = router;

verifyToken. js

const jwt = require('jsonwebtoken');

function tokenAuth (req,res,next){
    const token = req.header('auth-token');
    if (!token) return res.status(401).send("Access Denied!");
    try {
        const verified = jwt.verify(token, process.env.TOKEN_SECRET);
        req.user = verified;
        next();
    } catch(err) {
        res.status(400).send('Invalid_Token');
    }
}

module.exports = tokenAuth;

модель: пользователь. js

const mongoose = require('mongoose');
const Data = require('./Post');

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        min: 6,
        max: 255
    },
    email: {
        type: String,
        required: true,
        min: 6,
        max: 255
    },
    password: {
        type: String,
        required: true,
        min: 6,
        max: 1024
    },
    date: {
        type: Date,
        default: Date.now
    }
})

module.exports = mongoose.model('User', userSchema);

модель: пост. js

const mongoose = require('mongoose');

const PostSchema = mongoose.Schema({
        title: {
            type: String, 
            required: true,
            max: 40
        },
        desc: {
            type: String,
            required: true,
            max: 100
        },
        owner: {
            type: mongoose.Schema.Types.ObjectId,
            required: true,
            ref: 'User'
        }
})

module.exports = mongoose.model('Post', PostSchema);

Я полностью потерян, каждое решение либо не работает, либо не работает работать с моей настройкой!

Ответы [ 2 ]

1 голос
/ 23 января 2020

Поскольку в сообщении об ошибке указано "Cast to ObjectId failed for value \"{ iat: 1579749217 }\" at path \"owner\"", значение, которое вы пытаетесь сохранить при вставке записи для ключа владельца, не является идентификатором mon go. Попробуйте добавить точку останова на req.user или утешить ее, чтобы проверить, какое значение вы получаете в req.user.

0 голосов
/ 23 января 2020

Вы присваиваете декодированное значение JWT пользователю в verifyToken. js,

req.user = verified; 

и при попытке сохранить сообщение, написанное в коде в сообщениях. js,

const post = new Post({
        title: "FIRST TITLE",
        desc: "FIRST DESCRIPTION",
        owner: req.user
    })

Вы присваиваете декодированное значение владельцу с типом ObjectId. Пожалуйста, назначьте правильный ObjectId там. Вы можете сгенерировать его с помощью

new mongoose.Types.ObjectId();

или передать идентификатор из декодированного токена _id в mongoose.Types.ObjectId(), чтобы создать ObjectId, аналогичный представленному в коллекции User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...