Node.js Express+;Passport.js:req.user未定义

Node.js Express+;Passport.js:req.user未定义,node.js,reactjs,express,cors,passport.js,Node.js,Reactjs,Express,Cors,Passport.js,我有一个express API服务器和一个没有代理的create react应用程序。我对OAuth使用passport.js,它在MongoDB中查找以反序列化用户 在后端,我安装了cors中间件,在前端,我用我的服务器URL配置了axios基本URL 通过邮递员/手动在URL栏中写入端点,我的API请求成功并找到了req.user。但是如果我使用axios从前端发出API请求,req.user将是未定义的或空字符串 我不明白,请帮帮我,伙计们 Middleware.js app.use(

我有一个express API服务器和一个没有代理的create react应用程序。我对OAuth使用passport.js,它在MongoDB中查找以反序列化用户

在后端,我安装了cors中间件,在前端,我用我的服务器URL配置了axios基本URL

通过邮递员/手动在URL栏中写入端点,我的API请求成功并找到了req.user。但是如果我使用axios从前端发出API请求,req.user将是未定义的或空字符串

我不明白,请帮帮我,伙计们

Middleware.js

  app.use(cors())

  app.use(cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  }))

  app.use(compression())

  if (process.env.NODE_ENV !== 'production') {
    app.use(morgan('tiny'))
  }

  app.use(bodyParser.json())

  app.use(helmet())

  app.use(passport.initialize())
  app.use(passport.session())
authrouts.js

  app.get(
    '/auth/current_user',
    (req, res) => {
      res.send(req.user)
      console.log(req.user) // UNDEFINED ONLY WITH AXIOS IN REACT APP
    }
  )
actions.js

axios.defaults.baseURL = process.env.REACT_APP_API_URL

export const fetchUser = () => async dispatch => {
  const { data } = await axios.get('/auth/current_user')
  console.log('USER DATA: ')
  console.log(data === '') // TRUE
  dispatch({
    type: FETCH_USER,
    payload: data
  })
}
passport-config.js

passport.serializeUser((user, done) => {
  done(null, user.id)
})

passport.deserializeUser((id, done) => {
  User.findById(id).then(user => {
    done(null, user)
  })
})
复制步骤:

  • 克隆服务器
  • 克隆客户端

  • 在服务器上:npm运行启动开发

  • 在客户端:npm启动

当你使用谷歌登录时,验证流程正常,但是(正如你在“网络”chrome开发工具选项卡中看到的那样,“/auth/current_user”api请求有响应。data==”

我想我已经找到了解决方案

后端

首先,您必须安装cors
npm安装——保存cors
,然后粘贴此代码

import cors from 'cors'

app.use(cors({
  methods:['GET','POST'],
  credentials: true 
}))
前端

将axios与凭据和标题选项一起使用:

const config = {
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
  },
};
axios.post('http://localhost:8000/routes/register', user, config);

我希望它能帮助你或其他人。

我想我已经找到了解决办法

后端

首先,您必须安装cors
npm安装——保存cors
,然后粘贴此代码

import cors from 'cors'

app.use(cors({
  methods:['GET','POST'],
  credentials: true 
}))
前端

将axios与凭据和标题选项一起使用:

const config = {
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
  },
};
axios.post('http://localhost:8000/routes/register', user, config);

我希望它能帮助您或其他人。

那么您如何使用axios发送用户?在您的代码中,这取决于请求,而您的axios不发送任何请求,因此您如何期望用户出现在那里?我不想发送用户,我想获取用户。对于passport,用户应该在req.user中,因此对于axios,我希望在我的react应用程序中获取用户数据。这没有意义。你知道我在说什么吗?看看你的代码。当此块
const{data}=wait axios.get('/auth/current_user')
运行时,您没有发送任何身份验证标头。问题已使用passport configso更新。您是否已登录?那么您如何使用axios发送用户?在您的代码中,这取决于请求,而您的axios不发送任何请求,因此您如何期望用户出现在那里?我不想发送用户,我想获取用户。对于passport,用户应该在req.user中,因此对于axios,我希望在我的react应用程序中获取用户数据。这没有意义。你知道我在说什么吗?看看你的代码。您没有发送任何身份验证标头。问题已使用passport configso更新。当此块
const{data}=wait axios.get('/auth/current_user')
运行时,您是否已登录?