我正在我的网络应用程序中集成Stripe结帐 . 我已经在角度前端实现了Stripe checkout,并且还创建了一个后端,该后端应该接收条带检出传递的令牌 . 我收到一个未定义值'charge'的错误,这是我为事务创建的模型 . 我在这里错过了什么来正确传递令牌?
这是我得到的确切错误 . navabar.component.ts是我的结账方法 .
TypeError: Cannot read property 'charge' of undefined
at TokenCallback.token [as fn] (navbar.component.ts:104)
at TokenCallback.trigger (checkout.js:3)
at TokenCallback.trigger (checkout.js:3)
这是我的表单调用的checkout方法 .
openCheckout() {
let total = (this.donation * 100);
let handler = (<any>window).StripeCheckout.configure({
key: 'key_test',
locale: 'auto',
token: function (token: any) {
const transaction = new Charge(total, token.id);
console.log('From navbar nonObject ' + token.id + ' ' + total);
console.log(transaction + ' From navbar');
this.keyService.charge(transaction);
}
});
handler.open({
name: 'Delaware March for Jesus',
description: 'Donation',
amount: total
});
this.donation = 0;
this.donationEmail = '';
}
这是我的服务代码,它实现了收费并将令牌传递给后端 .
charge(transaction) {
const body = JSON.stringify(transaction);
const headers = new Headers();
headers.append('Content-type', 'application/json');
return this.http.post(this.keysUrlDev + '/charge', body, { headers: headers })
.map((response: Response) => response.json())
.catch((error: Response) => Observable.throw(error.json()));
}
我为交易构建的简单角度模型 .
export class Charge {
constructor(public amount: number,
public token: string) {}
}
我在nodejs上的POST路由获取令牌并将其传递给条带库charge.create方法 .
router.post('/charge', function(req, res, next) {
var amount = req.body.amount;
var token = req.body.token;
stripe.charges.create({
amount: amount,
currency: 'usd',
description: 'Delaware March For Jesus Donation',
source: token
}, function(err, charge) {
if (err) {
console.log(req.body.amount + ' From POST' + req.body.token);
return res.status(500).json({
title: 'An error occured',
error: err
});
}
res.status(201).json({
message: 'Charged successfully',
obj: charge
});
});
});
我已经google了,并试图调试,但无法使代码正常工作 . 谁能确定我做错了什么?
我还要注意,所有变量都被正确定义为'keysUrlDev'等 . 实时和测试密钥都正确地放在前端的checkout方法中,后端的密钥是条带库 .
***错误是由于错误的上下文 . 见下面的答案 .
1 回答
问题在于:
您遇到的问题是您尝试在错误的上下文中访问“this”关键字 . 您在此方案中访问的“this”是token()函数的“this”上下文,而不是组件本身的上下文 . 使用箭头函数(()=> {})将适当的上下文绑定到函数 .