【问题标题】:TypeError: Cannot read property 'authenticate' of nullTypeError:无法读取 null 的属性“身份验证”
【发布时间】:2020-08-29 13:03:38
【问题描述】:

我正在后端进行用户登录身份验证。每当我点击邮递员的发送请求时,它都会显示错误 TypeError:无法读取 null 的属性“身份验证” 在/home/saru/mernbootcamp/projbackend/controllers/auth.js 我在 stackoverflow 中检查了这个错误,但解决方案与我的情况不匹配

controllers/auth.js

`const User = require("../models/user");
//express-validator
const { check, validationResult } = require('express-validator');
var jwt = require('jsonwebtoken');
var expressJwt = require('express-jwt');

const dotenv = require("dotenv")
const config = dotenv.config({ path: './routes/.env' });

    //user object creation for class/model User
    const user = new User(req.body);

exports.signin = (req, res) => {
    const errors = validationResult(req);
    const { email, password } = req.body;

    if (!errors.isEmpty()) {
        return res.status(422).json({
            error: errors.array()[0].msg
        });
    }

    User.findOne({ email }, (err, user) => {
        if (err) {
            return res.status(400).json({
                error: "USER email does not exists"
            });
        }
        console.log(password);
        if (!user.authenticate(password)) {
            return res.status(401).json({
                error: "Email and password do not match"
            });
        }

        //create token
        const token = jwt.sign({ _id: user._id }, process.env.SECRET);
        //put token in cookie
        res.cookie("token", token, { expire: new Date() + 9999 });

        //send response to front end
        const { _id, name, email, role } = user;
        return res.json({ token, user: { _id, name, email, role } });
    });
};
`

models/user.js

`var mongoose = require("mongoose");
const crypto = require("crypto");
const uuidv1 = require("uuid/v1");

var userSchema = new mongoose.Schema(
    {
         email: {
            type: String,
            trim: true,
            required: true,
            unique: true
        },
      encry_password: {
            type: String,
            required: true
        },
        salt: String,
    },
    { timestamps: true }
);

userSchema
    .virtual("password")
    .set(function (password) {
        this._password = password;
        this.salt = uuidv1();
        this.encry_password = this.securePassword(password);
    })
    .get(function () {
        return this._password;
    });

userSchema.method = {
    authenticate: function (plainpassword) {
        return this.securePassword(plainpassword) === this.encry_password;
    },

    securePassword: function (plainpassword) {
        if (!password) return "";
        try {
            return crypto
                .createHmac("sha256", this.salt)
                .update(plainpassword)
                .digest("hex");
        } catch (err) {
            return "";
        }
    }
};

module.exports = mongoose.model("User", userSchema);
`

【问题讨论】:

  • 您能否检查一下 auth.js 中的电子邮件变量是否有效,并在尝试进行身份验证之前检查用户是否存在?
  • 当我在控制台中打印电子邮件和密码时,它运行良好。我认为该方法存在问题

标签: node.js express mongoose mern


【解决方案1】:

controllers/auth.js

if(err || !user) 中的 if(err) 替换为 if(err || !user) >findOne() 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2021-02-24
    • 2020-01-29
    • 2015-07-02
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多