程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈?

开发过程中遇到为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈的解决方法建议,希望对你解决为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈有所启发或帮助;

周日快乐

我正在尝试访问后端的 post 请求中的 req.user 属性,因为它返回未定义。

我运行时它显示完美

app.get('/API/current_user',(req,res) => {
        res.send(req.user);
    })

但是当我运行下面的路由时,req.user 返回未定义......

 app.post('/templates/create',async (req,res) => {
        const { template,body } = req.body  
        const newTemplate = new Template({
            template: template,body: body,_user: req.user.ID  
        })
        try {
            await newTemplate.save()
                return res.status(200).Json({
                    message: "successfully saved template"
                })
        } catch (err) {
            return console.log(err)
            }
        });

我似乎无法理解发生了什么?

这是下面的路由文件

const passport = require('passport');
const requireLogin = require('../mIDdlewares/requireLogin')
const cors = require('cors');
const axios = require('axios');
const Template = require('../models/Template');
const corsOptions ={
    origin: true,credentials:true,//access-control-allow-credentials:true
    optionsuccessstatus:200
}

module.exports = app => {
    app.get('/auth/Google',passport.authenticate('Google',{
        scope: ['profile','email']
    }));

    app.get(
        '/auth/Google/callBACk',passport.authenticate('Google'),res) => {
            res.redirect('/dashboard');
        }
    );

    app.post('/templates/create',_user: req.user.ID  
        })
        try {
            await newTemplate.save()
                return res.status(200).Json({
                    message: "successfully saved template"
                })
        } catch (err) {
            return console.log(err)
            }
        });
    
    


    app.get('/API/logout',cors(),res) => {
        req.logout();
        res.redirect('http://localhost:3000');
    });
    app.get('/API/current_user',res) => {
        res.send(req.user);
    })
}

解决方法

因为当使用passport.authenticate时它会将用户序​​列化为req对象 但是您没有将passport.authenticate 中间件添加到app.post('/templates/create',async (req,res) => { 所以用户它不会序列化为req 并且它将是未定义的。

,

您在发帖时要求提供用户 ID,但无法访问该用户 ID。您可以在使用 jwt 或 cookie 登录后创建身份验证承载。这样就可以到达用户id了。

,

经过两天的尝试,我解决了这个问题。问题是我的前端没有发送凭据。

这是我最初发送 post 请求的方式,而 req.user 将返回 undefined

当像下面这样执行 axios.post 时,axios 不会自动包含凭据,即使我像这样在逗号之后直接添加了 {Credentials: 'include'} axios.post('http://localhost:5000/template/create',{Credentials: 'include',createTemplatE})

还是坏了

 axios.post('http://localhost:5000/template/create',createTemplatE)
    .then((responsE) => {
      if(response.error) {
        setCreateTemplate({...createTemplate,error: response.error})
        console.log('this ran')
      } else {
          setCreateTemplate({...createTemplate,error: '',redirectToRefferrer: truE})
        
        toast.success(`successfully save your template as ${CreateTemplate.templatE}`);
   
      }
    })
   };

解决方案是像这样更改发布请求

axios({
      url:"http://localhost:5000/templates/create",method:"POST",data: createTemplate,withCredentials: true
    })
    .then((responsE) => {
      if(response.error) {
        setCreateTemplate({...createTemplate,redirectToRefferrer: truE})
        
        toast.success(`successfully save your template as ${CreateTemplate.templatE}`);
   
      }
    })
   };

我觉得很奇怪,包含凭据的 axios.post 一开始不起作用。谁能详细说明为什么会这样?

大佬总结

以上是大佬教程为你收集整理的为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈全部内容,希望文章能够帮你解决为什么可以在 get 请求中访问 user.id 而不是 post 请求? passport.js 和 mern 堆栈所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。