我......因为没有更好的术语,所以大家都离开这里时感到困惑。我有一个社交媒体克隆应用程序,我正在 MERN 堆栈中编写它以供学习,在一堆啧啧、书籍和视频之后,直到现在(除了一个小例外)事情进展顺利..
直到今天..
我正在尝试创建一个关注者/关注者系统,看起来好像我已经准备好了一切,但出于某种原因,我从 Mongoose 收到了 ObjectId 的 CastError ..
这是关键。它试图读取的“userId”实际上是我试图执行的函数。所以,不知何故,该函数被放入了 userId 字段,我一生都看不到在哪里。我在这一天的大部分时间里都在处理这个问题,所以我认为是时候召集比我更聪明、更好、更有经验的增援了......
给 TLDR 读者的警告.. 有很多代码正在向您发送,因为我想确保我展示了我拥有的一切..
我正在使用的模型(注意,我这里也有一些虚拟属性,我不知道它们与问题有关,因为它主要是关于散列密码等,而照片属性是设置为 Buffer 因为我想在我将存储系统放入其中以获取个人资料图片之前使此工作正常工作)
const UserSchema = new mongoose.Schema({
name: {
type: String,
trim: true,
required: 'Name is required'
},
about: {
type: String,
trim: true
},
email: {
type: String,
trim: true,
unique: 'Email already exists',
match: [/.+\@.+\..+/, 'Please fill a valid email address'],
required: 'Email is required'
},
photo: {
data: Buffer,
contentType: String
},
hashed_password: {
type: String,
required: "Password is required"
},
salt: String,
updated: Date,
created: {
type: Date,
default: Date.now
},
following: [{type: mongoose.Schema.ObjectId, ref: 'User'}],
followers: [{type: mongoose.Schema.ObjectId, ref: 'User'}]
})
调用函数的按钮:
import React from 'react'
import PropTypes from 'prop-types'
import Button from '@material-ui/core/Button'
import {unfollow, follow} from './api-user.js'
export default function FollowProfileButton (props) {
const followClick = () => {
props.onButtonClick(follow)
}
const unfollowClick = () => {
props.onButtonClick(unfollow)
}
return (<div>
{ props.following
? (<Button variant="contained" color="secondary" onClick={unfollowClick}>Unfollow</Button>)
: (<Button variant="contained" color="primary" onClick={followClick}>Follow</Button>)
}
</div>)
}
FollowProfileButton.propTypes = {
following: PropTypes.bool.isRequired,
onButtonClick: PropTypes.func.isRequired
}
按钮动作的函数,以及 Profile 组件上按钮的组件调用:
const clickFollowButton = (callApi) => {
callApi({
userId: jwt.user._id
}, {
t: jwt.token
}, values.user._id).then((data) => {
if (data.error) {
setValues({...values, error: data.error})
} else {
setValues({...values, user: data, following: !values.following})
}
})
}
<FollowProfileButton following={values.following} onButtonClick={clickFollowButton}/>
API 调用
const follow = async (params, credentials, followId) => {
try {
let response = await fetch('/api/users/follow/', {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + credentials.t
},
body: JSON.stringify({userId:params.userId, followId: followId})
})
return await response.json()
} catch(err) {
console.log(err)
}
}
API 的控制器(这个控制器最让我难堪。后面的控制器没有调用 userByID 控制器......但点击按钮会调用它。我知道这一点,因为那是我记录错误的地方..
const userByID = async (req, res, next, id) => {
console.log(req.params);
try {
let user = await User.findById(id).populate('following', '_id name')
.populate('followers', '_id name')
.exec()
if (!user)
return res.status('400').json({
error: "User not found"
})
req.profile = user
next()
} catch (err) {
console.log(err)
return res.status('400').json({
error: "Could not retrieve user"
})
}
}
const addFollowing = async (req, res, next) => {
try{
await User.findByIdAndUpdate(req.body.userId, {$push: {following: req.body.followId}})
next()
}catch(err){
return res.status(400).json({
error: errorHandler.getErrorMessage(err)
})
}
}
const addFollower = async (req, res) => {
try{
let result = await User.findByIdAndUpdate(req.body.followId, {$push: {followers: req.body.userId}}, {new: true})
.populate('following', '_id name')
.populate('followers', '_id name')
.exec()
result.hashed_password = undefined
result.salt = undefined
res.json(result)
}catch(err) {
return res.status(400).json({
error: errorHandler.getErrorMessage(err)
})
}
}
而且..我认为这就是一切..
我只是不明白为什么在请求中将“follow”传递到我的 userId 中.. 证据如下:
<块引用>{ userId: 'follow' } MongooseError [CastError]: Cast to ObjectId 模型“用户”的路径“_id”处的值“follow”失败 在新的 CastError (P:\projects\mern-social\node_modules.pnpm\mongoose@5.9.7_mongoose@5.9.7\node_modules\mongoose\lib\error\cast.js:29:11) 在model.Query.exec (P:\projects\mern-social\node_modules.pnpm\mongoose@5.9.7_mongoose@5.9.7\node_modules\mongoose\lib\query.js:4331:21) 在 userByID (webpack:///./server/controllers/user.controller.js?:50:162) 在 paramCallback (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:404:7) 在参数 (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:384:5) 在 Function.process_params (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:410:3) 在下一个 (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:275:10) 在 Function.handle (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:174:3) 在路由器 (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:47:12) 在 Layer.handle [as handle_request] (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\layer.js:95:5) 在trim_prefix (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:317:13) 在 P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:284:7 在 Function.process_params (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:335:12) 在下一个 (P:\projects\mern-social\node_modules.pnpm\express@4.17.1\node_modules\express\lib\router\index.js:275:10) 在 cors (P:\projects\mern-social\node_modules.pnpm\cors@2.8.5\node_modules\cors\lib\index.js:188:7) 在 P:\projects\mern-social\node_modules.pnpm\cors@2.8.5\node_modules\cors\lib\index.js:224:17 { messageFormat: undefined, stringValue: '"follow"', kind: 未定义,值:'跟随',路径:'_id',
所以,请..启发我,帮助一个苦苦挣扎的自学者理解他的方式的错误..(是的,我正在使用某些东西的旧版本,作为我正在使用的一本书尝试学习这个堆栈使用的是旧东西..当然,一旦我在书中有了这个项目,我就会学习新的和改进的东西并重构..我只需要一个指南来帮助我开始)>