Невозможно сослаться на схему токена, токен mongodb, экспресс-паспорт - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужна помощь, чтобы справиться с этой проблемой в течение нескольких дней.

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

вот мой код для index.js в папке контроллеров

const User = require("../models/user");
const Token = require("../models/token")
const crypto = require("crypto");
const nodemailer = require("nodemailer");


var smtpTransport = nodemailer.createTransport({
    service: 'Gmail', 
    auth: {
      user: process.env.GMAILUSER,
      pass: process.env.GMAILPW
    }
  });

module.exports = {
  async postRegister(req, res, next)  {      
            var user = new User({ 
             name: req.body.name, 
             email: req.body.email,
             isVerified: false,
                username: req.body.username
            });

        await User.register(user, req.body.password);       
        res.redirect('/');

        var token = new Token({ _userId: user._id, token: crypto.randomBytes(16).toString('hex') });
        token.save(function (err) {
        if (err) { return res.status(500).send({ msg: err.message 
        }); 
    }  
        var mailOptions = {
        to: user.email,
        from: 'xxxt@xxx.com',
        subject: 'xxxxx verify email',
        text:'You are receiving this because you need to verify your email 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 + '/confirmation/' + token.token + '\n\n' +
          'If you did not request this, please ignore this email.\n'
      };
      smtpTransport.sendMail(mailOptions, function(err) {
        if (err) { return res.status(500).send({ msg: err.message }); }
                res.status(200).send('A verification email has been sent to ' + user.email + '.');

    });
        })
  },


     confirmationPost(req,res, next) {
    Token.findOne({ token: req.params.token }, function (err, token) {
        if (!token) 
        {console.log("sss")
        } else {

    User.findOne({  _id: token._userId, email: req.body.email }, function (err, user) {
      if (!user) return console.log(user)
      if (user.isVerified) return res.status(400).send({ type: 'already-verified', msg: 'This user has already been verified.' });

      user.isVerified = true;
      user.save(function (err) {
          if (err) { return res.status(500).send({ msg: err.message }); }
          res.status(200).send("The account has been verified. Please log in.");

        })

});
};
})
}
}

Это моя схема токена

const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');
const Schema = mongoose.Schema;


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

tokenSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('Token', tokenSchema);

наконец моя схема пользователя

const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');
const Schema = mongoose.Schema;

const UserSchema = new Schema({
    username: String,
    name: String,
    email: { type: String, unique: true },
    image: String,
    isVerified: { type: Boolean, default: false },
    password: String,
    passwordResetToken: String,
    passwordResetExpires: Date,

    posts: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Post'
        }
    ]
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('User', UserSchema);

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

и обнаружил, что эта строка из папки контроллеров index.js

confirmationPost(req,res, next) {
        Token.findOne({ token: req.params.token }, function (err, token) {
            if (!token) 
            {console.log("err")
            } else {

        User.findOne({  _id: token._userId, email: req.body.email }, function (err, user) {

возвращает мне ноль.

как это сделатья связываю текущую строку, чтобы получить токен от зарегистрированного пользователя?

Я использовал почтальон, чтобы отправить запрос на получение маршрута подтверждения, возвращая тот же токен, и он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...