Im przy użyciu Stripe Checkout.js do utworzenia płatności. Tworzę obsługi, że na sukces wysyła token do serwera:Stripe - JSON Circular reference
let handler = StripeCheckout.configure({
key: 'my_key',
image: 'image.png',
locale: 'auto',
token: token => {
console.log(token.id);
// ... send token to server
}
});
Potem korzystania z obsługi, aby utworzyć token:
handler.open({
name: 'Test',
description: 'test',
billingAddress: false,
currency: 'eur',
amount: '1200',
});
Ten uchwyt uruchamia okienko checkout.js testowe , które wypełniam i klikam Pay. Kończy się pomyślnie, co oznacza, że przycisk wyświetla się na zielono.
Ale od chwili przycisk na zielono, a moment, że znak jest drukowany na konsoli (na zwrotnego sukcesu handler), zostanie zgłoszony błąd:
EXCEPTION: TypeError: Converting circular structure to JSON
Główną częścią stacktrace jest to:
TypeError: Converting circular structure to JSON
at Object.stringify (native)
at Object.stringify (http://localhost:5000/dist/client/bundle.js:46294:29)
at RPC.sendMessage (https://checkout.stripe.com/checkout.js:1:18068)
at RPC.sendMessage (https://checkout.stripe.com/checkout.js:1:16180)
at https://checkout.stripe.com/checkout.js:1:17137
at RPC.ready (https://checkout.stripe.com/checkout.js:1:17416)
at RPC.invoke (https://checkout.stripe.com/checkout.js:1:17084)
at RPC.invoke (https://checkout.stripe.com/checkout.js:1:16180)
at RPC.processMessage (https://checkout.stripe.com/checkout.js:1:18899)
at RPC.processMessage (https://checkout.stripe.com/checkout.js:1:16180)
sprawdzając kod, widzimy, że problem jest tutaj:
RPC.prototype.sendMessage = function(method, args) {
var err, id, message, _ref;
if (args == null) {
args = []
}
id = ++this.rpcID;
if (typeof args[args.length - 1] === "function") {
this.callbacks[id] = args.pop()
}
message = JSON.stringify({
method: method,
args: args,
id: id
});
Wygląda na to, że plik Checkout.js tworzy obiekt komunikatu, który ma cykliczne odwołanie, a następnie próbuje wywołać na nim JSON.stringify, co powoduje błąd.
Ten błąd nie jest krytyczny, a płatność przechodzi, ale czy wiesz, co to może być i jak to naprawić?
Czy istnieje znane obejście tego problemu.
Zauważ, że wywołanie stringify
przed przekazaniem obiektu do postMessage
może nie być konieczne w zależności od MDN docs.
postMessage
wykorzystuje mechanizm serializacji obsługujący odwołania kołowe zgodnie z this.
Więc szarpiesz jakiś obiekt, który ma odniesienia do siebie. Uporządkuj go bez tych odniesień. Czym jest "args"? – dfsq
stringify jest w kodzie kasowym, a nie w kodzie aplikacji. Zgłosiłem problem Stripe, ale opublikowałem to tutaj, ponieważ być może ktoś wie o obejściu tego problemu. Również z Angular 2 będąc w wersji beta, nigdy nie wiesz –
Czy próbowałeś debugować ten fragment kodu za pomocą JSON.stringify? – dfsq