我想使用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);
我完全迷失了,每个解决方案都不起作用,或者不适用于我的设置!
答案 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相同的对象。