【问题标题】:req.user not defined when calling from android application从android应用程序调用时未定义req.user
【发布时间】:2020-04-08 06:14:43
【问题描述】:

我正在与一位同事合作开发一个 android 应用程序,他是一名 Android 开发人员,我对 android dev 知之甚少。我做后端工作,使用 node.js、express 和 passport.js 进行登录和身份验证。

我在本地托管服务器并使用邮递员检查身份验证和注册过程,一切正常。我正在获取我朋友想要的前端状态码。在使用 passport.js 的身份验证部分,成功时我传递了req.user,它应该返回用户正文,以便前端的朋友可以使用用户对象中的字段user.firstName 来显示欢迎消息。

通过 Postman,定义了用户主体,我在 Postman 窗口中获取了一个包含所有字段的用户对象,但通过应用程序它给出了错误。

firstName 是未定义的属性。

Passport.js 逻辑:

const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

//load user model

const User = require('../models/UserSchema');

module.exports = function(passport){
  passport.use(
    new LocalStrategy({usernameField: 'roll'}, (roll, password, done) => {
      //find user
      User.findOne({roll: roll})
        .then(user =>{
        if(!user){
          return done(null, false, {message: 'Roll number not registered'});
        }

        //match password
        bcrypt.compare(password, user.password, (err, isMatch) =>{
          if(err) throw err;

          if(isMatch){
            return done(null, user);
          }else{
            return done(null, false, {message: 'Password incorrect'});
          }
        })


      })
        .catch(err => console.log(err));

    })

  );

  /*passport.serializeUser( function(id, done)  {
        done(null, User.roll);
    });

    passport.deserializeUser(function(id, done){
        User.findById(roll, function(err, user){
            done(err, user);
        });
    });*/


  passport.serializeUser(function(user, done) {
    done(null, user);
  });

  passport.deserializeUser((_id, done) => {
    User.findById( _id, (err, user) => {
      if(err){
        done(null, false, {error:err});
      } else {
        done(null, user);
      }
    });
  });

}

登录路径:

//Login Handle

    router.post('/login', (req, res, next) =>{
    console.log('/user/login')
    passport.authenticate('local', {

        successRedirect: '/success',
        failureRedirect: '/failure',
        session: true,
        failureFlash: false

    })(req, res, next);
    //res.json(pass.user.name);
});

/成功路线:

    router.get('/success', (req, res) => {
    console.log(req);
    let message = 'Login Succesful';
    //let user = req.user.firstName
    res.status(200).json({'message':message, 'user': req.user.firstName});
})

【问题讨论】:

  • 抱歉还有一个小细节,我尝试在 /success 块中使用 console.log 'req' 并通过邮递员,它在控制台中提供对象,如下所示: user: { balance: 20000,交易:[],_id:5e8cb6bbdb4dd34a30161f51,名字:'apple',姓氏:'singh',电子邮件:'a@gmail.com',密码:'$2a$10$Zp4VR5QE0qNkpz8fSdY8YuC7O0gQQqoKFNvFNrYcKvh18UwjQODCi'/16',滚: , date: 2020-04-07T17:22:03.681Z, __v: 0 },但是通过前端应用程序 req 在 console.log 中没有用户对象。
  • 嘿@Shamil,您可以编辑您的问题以添加您刚刚发表的评论

标签: javascript android node.js express passport.js


【解决方案1】:

我猜您还使用body-parserexpress.json() 将传入的正文请求解析为JSON。如果是这种情况,您应该像这样发回响应:

req.body.user.firstName

对于 POST 请求:req.body

对于 GET 参数:req.params

对于 GET 查询字符串:req.query

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2019-09-30
    • 2021-04-22
    • 1970-01-01
    • 2022-10-06
    • 2015-07-18
    相关资源
    最近更新 更多