为什么来自一个js文件的变量在发送到另一个js文件时变得未定义

时间:2017-05-16 00:34:40

标签: javascript node.js stripe-payments

目前,我有这个代码块,它是我的Stripe设置的后端。在回调函数上,我设置的变量等于向用户卡收取的金额。然后,我想将此值发送到另一个路由文件,以便我可以将数量res.send()传入浏览器。

当我尝试这样做时,变量以某种方式被设置为从a点到b点的未定义。

router.post('/charge', function(req, res, next) {
    var token = req.body.stripeToken;
    var chargeAmount = req.body.amount[0];
    var charge = stripe.charges.create({
      amount: chargeAmount,
      currency: "usd",
      source: token
    }, function(err, charge) {
      if(err) {
        return console.log(err);
      }
      module.exports.theAmount = charge.amount;
      res.redirect('/users/dashboard');
    });
});

module.exports = router;

以下是路径文件中的代码,我试图将收费金额计入:

var stripeFile = require('stripe');

router.get('/dashboard', isLoggedIn, function(req, res, next) {
  var messages = req.flash('error');
  res.render('users/dashboard', {messages: messages, hasErrors: messages.length > 0});
  console.log(stripeFile.theAmount);
});

1 个答案:

答案 0 :(得分:0)

你无法以这种方式编程。您的服务器处理来自许多不同用户的请求。尝试将charge.amount填充到一个全局模块中,以便稍后在另一个请求中使用它时,重定向只是错误和不恰当的编码,即使它只运行一次,也能保证一旦有竞争条件多个用户正在使用您的网站。你永远不能这样编程。

您还没有在这里解释整个问题,但总的来说,在不使用重定向的情况下解决您的设计问题会更好。这样可以避免在等待重定向请求再次返回时找到一些特定于用户的存储charge.amount的位置。如果你必须将它存储在某个地方,那么你需要使用flash模块,或者你应该为每个用户创建一个会话对象并将数据存储在会话中(flash做类似的事情,但它仅用于& #34; next"来自该用户的请求)。会话通过cookie绑定到用户,因此当下一个请求来自重定向时,会话中间件可以识别cookie,查找属于该cookie的会话对象,然后您的请求处理程序可以访问您的任何数据。 #39;已投入该用户的会话(例如charge.amount值)。

最好直接从.post()处理程序返回内容。您已在该请求处理程序中拥有charge.amount值,因此您可以使用该值轻松呈现模板,并在帖子后将该内容返回给浏览器。然后,无需在服务器上的任何位置存储该值,等待将来的请求。