Пользователь не определен в функции контроллера Node.js Express - PullRequest
0 голосов
/ 30 января 2019

Когда я нажимаю кнопку сброса пароля, он выдает, что пользователь не определен в командной строке для серверной части.Я использую Mongoose с Node.js Express.Вот код для модели и контроллера.

контроллер

const User = require('../models/userModels');
const passwordResetToken = require('../models/resettokenModels');

async ResetPassword(req, res) {
    if (!req.body.email) {
      return res
        .status(HttpStatus.INTERNAL_SERVER_ERROR)
        .json({ message: 'Email is required' });
    }

    const userEmail = await User.findOne({
      email: Helpers.lowerCase(req.body.email)
    });
    if (!userEmail) {
      return res
        .status(HttpStatus.CONFLICT)
        .json({ message: 'Email does not exist' });
    }

            var resettoken = new passwordResetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });
            resettoken.save(function (err) {
                if (err) { return res.status(500).send({ msg: err.message }); }
                var transporter = nodemailer.createTransport({
                    service: '"SendGrid"',
                    auth:
                     {
                      user: 'email',
                      pass: 'password'
                     }
                });
                var mailOptions = {
                    from: 'email',
                    subject: 'Node.js Password Reset',
                    text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
                      'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
                      'http://' + req.headers.host + '/reset/' + resettoken + '\n\n' +
                      'If you did not request this, please ignore this email and your password will remain unchanged.\n'
                }

                transporter.sendMail(mailOptions 
                )          
            })

        .catch(err => {
            res
                .status(HttpStatus.INTERNAL_SERVER_ERROR)
                .json({ message: 'Error occured' });
        });
    },

А вот модель

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const resettokenSchema = new mongoose.Schema({
    _userId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' },
    resettoken: { type: String, required: true },
    createdAt: { type: Date, required: true, default: Date.now, expires: 43200 },
});

module.exports = mongoose.model('passwordResetToken', resettokenSchema);

USER модель

const userSchema = new mongoose.Schema({
  username: { type: String },
  email: { type: String },
  password: { type: String },
  ...
 ...

Ошибка отображается в этой строке внутри контроллера

 var resettoken = new passwordResetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });

Что может вызвать такую ​​проблему?

1 Ответ

0 голосов
/ 30 января 2019

Как уже упоминалось в комментариях, вы ничего не настраиваете пользователя.

edit:

Это использует вашу пользовательскую схему, вы показали выше, что у пользовательской схемы есть имя пользователя, адрес электронной почты, парольи т. д.

const user = await User.findOne({
      email: Helpers.lowerCase(req.body.email)
    });

Ваш токен сброса должен сделать это:

var resettoken = new passwordResetToken({ _userId: user._id, resettoken: crypto.randomBytes(16).toString('hex') });

Ваш нодмейлер должен сделать это:

var mailOptions = {
  from: 'mail@mail.com',
  to: user.email,
  subject: 'Node.js Password Reset',
  text: 'some message'
}

transporter.sendMail(mailOptions)  
...