Javascript 将两个功能合并为一个条带和Passport

Javascript 将两个功能合并为一个条带和Passport,javascript,node.js,express,stripe-payments,passport.js,Javascript,Node.js,Express,Stripe Payments,Passport.js,我现在已经设置好了,所以用户只需使用他们的电子邮件和密码即可注册。简单易行,我希望他们能够从select元素中选择一个计划。我知道如何使用req.body.plan访问请求的部分,如果选择的name是plan 我目前有两个独立的控制器函数,以稍微不同的方式来实现这一点。我有它,所以postSignup使用passport.js为用户注册,一切都很好。我还有一个postPlan,当用户在/billing上选择一个计划,然后提交一个表单,让他们将该计划分配给他们。我一直坚持的部分是User.find

我现在已经设置好了,所以用户只需使用他们的电子邮件和密码即可注册。简单易行,我希望他们能够从
select
元素中选择一个计划。我知道如何使用
req.body.plan
访问请求的部分,如果选择的
name
plan

我目前有两个独立的控制器函数,以稍微不同的方式来实现这一点。我有它,所以
postSignup
使用passport.js为用户注册,一切都很好。我还有一个
postPlan
,当用户在
/billing
上选择一个计划,然后提交一个表单,让他们将该计划分配给他们。我一直坚持的部分是
User.findById(req.User.id,function(err,User){
部分,更具体地说是
req.User.id
。我如何将下面的两个函数合并,以便根据注册表单中的select元素设置用户的计划

后期计划

exports.postPlan = function(req, res, next){
  var plan = req.body.plan;
  console.log("plan: ",req.body.plan);
  var stripeToken = null;

  if(plan){
    plan = plan.toLowerCase();
  }

  if(req.user.stripe.plan == plan){
    req.flash('info', {msg: 'The selected plan is the same as the current plan.'});
    return res.redirect(req.redirect.success);
  }

  if(req.body.stripeToken){
    stripeToken = req.body.stripeToken;
  }

  if(!req.user.stripe.last4 && !req.body.stripeToken){

    req.flash('errors', {msg: 'Please add a card to your account before choosing a plan.'});
    return res.redirect(req.redirect.failure);
  }

  User.findById(req.user.id, function(err, user) {
    if (err) return next(err);

    user.setPlan(plan, stripeToken, function (err) {
      var msg;

      if (err) {
        if(err.code && err.code == 'card_declined'){
          msg = 'Your card was declined. Please provide a valid card.';
        } else if(err && err.message) {
          msg = err.message;
        } else {
          msg = 'An unexpected error occurred.';
        }

        req.flash('errors', { msg:  msg});
        return res.redirect(req.redirect.failure);
      }
      req.flash('success', { msg: 'Plan has been updated.' });
      res.redirect(req.redirect.success);
    });
  });
};
注册后

    exports.postSignup = function(req, res, next){
      req.assert('email', 'Please sign up with a valid email.').isEmail();
      req.assert('password', 'Password must be at least 6 characters long').len(6);

      var errors = req.validationErrors();

      if (errors) {
        req.flash('errors', errors);
        req.flash('form', {
          email: req.body.email
        });
        return res.redirect('/signup');
      }
      // calls next middleware to authenticate with passport
      passport.authenticate('signup', {
        successRedirect: '/dashboard', // Select redirect for post signup
        failureRedirect: '/signup',
        failureFlash : true
      })(req, res, next);
        next();
    };
当前想法

    exports.postSignup = function(req, res, next){
  req.assert('email', 'Please sign up with a valid email.').isEmail();
  req.assert('password', 'Password must be at least 6 characters long').len(6);

  var errors = req.validationErrors();

  if (errors) {
    req.flash('errors', errors);
    req.flash('form', {
      email: req.body.email
    });
    return res.redirect('/signup');
  }
  // calls next middleware to authenticate with passport
  passport.authenticate('signup', {
    successRedirect: '/dashboard', // Select redirect for post signup
    failureRedirect: '/signup',
    failureFlash : true
  });
  // var plan = req.body.plan;
  var plan = 'silver';
  var stripeToken = null;
  if(req.body.stripeToken){
    stripeToken = req.body.stripeToken;
  }
  User.findById({"email":req.body.email}, function(err, user) {
    if (err) return next(err);
    console.log("Ran here");
    user.setPlan(plan, stripeToken, function (err) {
      var msg;
      if (err) {
        if(err && err.message) {
          msg = err.message;
        } else {
          msg = 'An unexpected error occurred.';
        }
        req.flash('errors', { msg:  msg});
        return res.redirect(req.redirect.failure);
      }
      req.flash('success', { msg: 'Thanks for signing up! ' });
      res.redirect(req.redirect.success);
    });
  });

  (req, res, next);
    next();
};
上述当前尝试的错误消息

{
  "message": "Cast to ObjectId failed for value \"{ email: 'snappierjaguar@gmail.com' }\" at path \"_id\" for model \"User\"",
  "error": {
    "message": "Cast to ObjectId failed for value \"{ email: 'snappierjaguar@gmail.com' }\" at path \"_id\" for model \"User\"",
    "name": "CastError",
    "stringValue": "\"{ email: 'snappierjaguar@gmail.com' }\"",
    "kind": "ObjectId",
    "value": {
      "email": "snappierjaguar@gmail.com"
    },
    "path": "_id"
  }
}