微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.save() 不是函数猫鼬

如何解决.save() 不是函数猫鼬

所以,我不是 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,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 是完全空的。我可能会完全重新访问此代码并对其进行一些重大更改.. 学习的所有部分,对吗?

以下是请求的身份验证方法(我现在使用会话存储,但可能会更改为 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
}

解决方法

可能出错的地方:(代码未显示)

如果您的 req.profile 不是猫鼬对象,这将不起作用

char

从您的其他帖子中,我认为您可能从 jwt 中获得了 req.profile。这意味着这不是猫鼬对象。您需要做的是:

  • 正如您提到的,使用 NUL 传递 let user = req.profile 和要更新的对象。请注意,如果您有 findByIdAndUpdate 的猫鼬中间件,它将不会在此处运行

  • 执行id,根据您的需要更新用户,然后使用save。这使您可以对其进行更多控制,但会运行 2 个操作。

,

这已经解决了..我的问题显然是表单没有正确地将请求正文传递给 API,这是由错误安装依赖项引起的。一旦我解决了这个问题,剩下的就顺理成章了,我现在可以轻松地做我需要做的事情了..

感谢所有试图与我一起解决此问题的人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。