使用猫鼬和节点/快递麻烦保存新帖子

时间:2020-01-23 07:11:24

标签: javascript node.js mongodb express mongoose

我想使用Mongoose和Node / Express将新帖子保存到MongoDB。对我来说,这是开始使用Node在博客网站上工作所缺少的部分。

我正在分享来自的代码

'路线':帖子,verifyToken和身份验证 模型:帖子,用户

当我尝试使用发布路线发布时发生错误。

{
    "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"
}

posts.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;

模型:User.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);

模型:Post.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 个答案:

答案 0 :(得分:1)

由于错误指出"Cast to ObjectId failed for value \"{ iat: 1579749217 }\" at path \"owner\"",因此在插入所有者密钥的帖子时尝试保存的值不是mongo id。尝试在req.user处添加一个断点,或安慰它以检查您在req.user中获得的值是什么。

答案 1 :(得分:0)

您要在verifyToken.js中为用户分配已解码的JWT值,

req.user = verified; 

,当您尝试将用代码编写的帖子保存在posts.js中时,

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

您正在将解码后的值分配给类型为ObjectId的所有者。请在此处分配一个有效的ObjectId。 您可以使用

生成它
new mongoose.Types.ObjectId();

或从_id中的解码令牌mongoose.Types.ObjectId()传递ID,以构造与User集合中存在的ObjectId相同的对象。