【问题标题】:node.js email verification tokennode.js 电子邮件验证令牌
【发布时间】:2014-10-07 13:48:31
【问题描述】:

我正在尝试根据这篇博文在 Mongoose、Express Node 应用程序中设置一个验证步骤...http://danielstudds.com/adding-verify-urls-to-an-express-js-app-to-confirm-user-emails-secure-spa-part-6/ 那篇博文已有一年多的历史了,所以它的第一个谷歌结果让我有点惊讶'节点电子邮件验证'。我对节点很陌生,所以我依赖示例。根据那篇文章,我没有看到下载,所以我将它拼凑起来以适合我的场景,这就是我的代码的样子。

验证模型

var mongoose = require('mongoose'),
    uuid = require('node-uuid'),
    User = require('mongoose').model('User');

var verificationTokenSchema = new mongoose.Schema({
   _userid : { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
   token: {type: String, required: true},
   createdAt: {type: Date, required: true, default: Date.now, expires: '4h'}
});

verificationTokenSchema.methods = {
   createVerificationToken : function (done) {

      var verificationToken = this;
      var token = uuid.v4();
      verificationToken.set('token', token);
      verificationToken.save( function (err) {
         if (err) return done(err);
            return done(null, token);
      });
   }
};

exports.verifyUser = function(token, done) {
   verificationTokenModel.findOne({token: token}, function (err, doc){
      if (err) return done(err);
      User.findOne({_id: doc._userId}, function (err, user) {
         if (err) return done(err);
         user["verified"] = true;
         user.save(function(err) {
            done(err);
         });
      });
   });
};


var verificationTokenModel = mongoose.model('VerificationToken', verificationTokenSchema);
exports.verificationTokenModel = verificationTokenModel;

然后在我的用户模型中,我像这样调用 create..

用户模型

exports.createUser = function(req, res, next) {
   // Do all the stuff that creates the user save it and get the id back
   var verificationToken = new verificationTokenModel({_userId: user._id});
   verificationToken.createVerificationToken(function (err, token) {
       if (err){
           err = new Error("Couldn't create verification token");
           res.status(400);
           return res.send({reason:err.toString()});
        }

        // Do stuff with the token here and email

这在我的数据库“verificationtokens”集合中“部分”有效,对象不包含 _userid 它们包含存储在 _id 中的 _userid (user._id)

我的第一个问题是我真的不明白当没有“构造函数”时它是如何工作的

var verificationToken = new verificationTokenModel({_userId: user._id});

以及如何将 user._id 作为 _userid 存储在验证集合中

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我没有使用 Mongoose,但它是这样发生的:

    • 第一个问题:

    当你运行时:

    var verificationTokenModel = mongoose.model('VerificationToken', verificationTokenSchema);
    

    它创建构造函数。

    • 第二个问题:

    MongoDB 总是使用名为“_id”的字段创建文档,因此,验证集合中的“_id”字段不是用户集合中的“_id”字段。 _userid 没有插入的原因是你打错了:

    var verificationToken = new verificationTokenModel({_userId: user._id});
    

    其中“_userId”应该是“userid”

    【讨论】:

    • 该死-不敢相信我错过了。所以一个后续问题,现在它工作正常 - 在验证令牌集合中,_userid 和 _id 现在匹配,例如它们都有一个 ObjectId("12345") 的值,为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2015-04-08
    • 2014-09-26
    • 2018-12-12
    相关资源
    最近更新 更多