【发布时间】:2021-07-14 06:19:36
【问题描述】:
所以,我不是 100% 为什么这没有按预期工作。我有一个 Edit Profile React 组件(我目前正在学习如何使用 MERN 堆栈构建基于 SSR 的应用程序)-但是当我提交编辑时,我收到一个错误 "user.save is not a功能 - 代码:
从路线:
router.route('/api/users/:userId')
.get(authCtrl.requireSignin, userCtrl.read)
.put(authCtrl.requireSignin, authCtrl.hasAuthorization, userCtrl.update)
.delete(authCtrl.requireSignin, authCtrl.hasAuthorization, userCtrl.remove)
API 助手:
const update = async (params, credentials, user) => {
try {
let response = await fetch('/api/users/' + params.userId, {
method: 'PUT',
headers: {
"Accept": 'application/json',
Authorization: 'Bearer ' + credentials.t
},
body: user
})
return await response.json()
} catch (err) {
console.log(err)
}
}
最后是处理更新背后所有逻辑的实际控制器:(此函数在将密码信息传递回客户端之前对其进行清理,因此未定义)
const update = (req, res) => {
let form = new formidable.IncomingForm()
form.keepExtensions = true
form.parse(req, async (err, fields, files) => {
if (err) {
return res.status(400).json({
error: "Photo could not be uploaded"
})
}
let user = req.profile
user = extend(user, fields)
user.updated = Date.now()
if(files.photo){
user.photo.data = fs.readFileSync(files.photo.path)
user.photo.contentType = files.photo.type
}
try {
await user.save()
user.hashed_password = undefined
user.salt = undefined
res.json(user)
} catch (err) {
console.log(err)
return res.status(400).json({
error: errorHandler.getErrorMessage(err)
})
}
})
}
这不是一个生产级应用程序,只是为了让我从头开始学习如何做到这一点(没有 CRA,并且全部包含在一个使用 SSR 的项目中)
编辑:经过一番挖掘,console.logs 和 console.dirs,我发现从组件传递的更新甚至没有传递给控制器。过时的数据(来自数据库)正在记录,但 req.profile 完全为空。我可能会完全重新访问此代码并对其进行一些重大更改。所有学习的一部分,对吧?
以下是请求的身份验证方法(我现在使用的是 Session Storage,但可能会更改为 localStorage):
import User from '../models/user.model'
import jwt from 'jsonwebtoken'
import expressJwt from 'express-jwt'
import config from './../../config/config'
const signin = async (req, res) => {
try {
let user = await User.findOne({email: req.body.email})
if (!user) {
return res.status(401).json({error: "User not found"})
}
if (!user.authenticate(req.body.password)) {
return res.status(401).send({error: "Email and Password do not match"})
}
const token = jwt.sign({_id: user._id}, config.jwtSecret)
res.cookie('t', token, {expire: new Date() + 9999})
return res.json({
token,
user: {
_id: user._id,
name: user.name,
email: user.email
}
})
} catch (err) {
return res.status(401).json({error: "Could not sign in"})
}
}
const signout = (req, res) => {
res.clearCookie('t')
return res.status(200).json({message: "Signed out"})
}
const requireSignin = expressJwt({
secret: config.jwtSecret,
algorithms: ['sha1', 'RS256', 'HS256'],
userProperty: 'auth'
})
const hasAuthorization = (req, res, next) => {
const authorized = req.profile && req.auth
&& req.profile._id == req.auth._id
if (!(authorized)) {
return res.status(403).json ({error: "User is not authorized"})
}
next()
}
export default {
signin,
signout,
requireSignin,
hasAuthorization
}
【问题讨论】:
-
你能贴出这两种方法的代码吗?
authCtrl.requireSignin和authCtrl.hasAuthorization
标签: node.js reactjs mongodb mongoose mern