Node.js 邮件验证令牌

4
我正在尝试在基于Mongoose、Express和Node的应用程序中设置验证步骤,参考了这篇博客文章:http://danielstudds.com/adding-verify-urls-to-an-express-js-app-to-confirm-user-emails-secure-spa-part-6/。这篇文章已经发表了一年之久,因此我很惊讶它是“node email verification”搜索的首个谷歌结果。由于我对Node非常陌生,所以我依赖示例。根据该文章,我没有看到下载链接,因此我组合了代码以适应我的情况,以下是我的代码。 验证模型
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)。

我的第一个问题是当没有“constructor”时我不太理解它是如何工作的。

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

我该如何将用户的._id存储为验证集合中的_userid?
1个回答

0

我不使用Mongoose,但是这是它发生的事情:

  • 对于你的第一个问题:

当你运行:

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

它创建构造函数。

  • 对于第二个问题:

MongoDB总是创建一个名为"_id"的字段的文档,所以你验证集合中的"_id"字段不是来自你的User集合的"_id"字段。_userid没有被插入的原因是因为你打错了:

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

在这里 "_userId" 应该改为 "userid"


真糟糕 - 真不敢相信我错过了那个。现在问题来了,既然它已经正确地工作了 - 在verificationtokens集合中,_userid和_id现在匹配,例如它们都有一个ObjectId("12345")的值,为什么会这样呢? - maehue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接