Ошибка JSON / EJSON с API Stripe - событие Webhook Invoice - PullRequest
0 голосов
/ 18 декабря 2018

Обновление с дополнительной информацией - 18 декабря

По мере дальнейшего тестирования выясняется, что ошибка изолирована от "this.response.end (json);"См. Примечания ниже:

событие чередования без накладных: a) "this.response.end (EJSON.stringify (obj, {indent: true}));"работает и возвращает 200 б) "this.response.end (EJSON.stringify (obj));"нет ошибки на локальном сервере, ошибка на панели инструментов полосы с «невозможно подключиться» и не возвращает код 200

событие счета полосы: a) "this.response.end (EJSON.stringify (obj, {indent:правда}));"выдает ошибки - подробности см. ниже.б) "this.response.end (EJSON.stringify (obj));"нет ошибки на локальном сервере, ошибка на панели инструментов полосы с «невозможно подключиться» и не возвращает код 200

Любое понимание будет приветствоваться.

У меня возникли некоторые проблемы с API Stripe, и мне нужна помощь или понимание.Я использую ngrok для локального тестирования веб-крючков Stripe, и все работает нормально, пока я не сделаю запрос на любой тип события Stripe 'invoice' (например, invoice.payment_succeeded).Когда я запускаю тест для любого типа события «счет-фактура», я получаю несколько ошибок:

  1. мое работающее приложение разрывается (т. Е. Требует, чтобы я запустил запуск метеора в терминале, чтобы перезапустить приложение)

  2. Я получаю это сообщение об ошибке на стороне сервера в моем терминале:

///error message start///
events.js:183
     throw er; // Unhandled 'error' event
     ^

Error: write after end
   at write_ (_http_outgoing.js:622:15)
   at ServerResponse.write (_http_outgoing.js:617:10)
   at IncomingMessage.ondata (_stream_readable.js:639:20)
   at emitOne (events.js:116:13)
   at IncomingMessage.emit (events.js:211:7)
   at IncomingMessage.Readable.read (_stream_readable.js:475:10)
   at flow (_stream_readable.js:846:34)
   at resume_ (_stream_readable.js:828:3)
   at _combinedTickCallback (internal/process/next_tick.js:138:11)
   at process._tickCallback (internal/process/next_tick.js:180:9)
///error message end///
На панели инструментов Stripe я получаю сообщение об ошибке: 'Test webhook error: Unable to connect'

И снова это прерывается, только когда я делаю запрос на любой тип события Stripe 'invoice' (например, invoice.payment_succeeded).

Я связался со Страйпом, чтобы узнать, есть ли что-то еще, что я должен рассмотреть, но они сказали, что все в порядке с их стороны.

И последнее замечание: чтобы запустить ngrok, я использую 'ngrok http 3000'.

. С учетом вышесказанного мой код веб-крюка на стороне сервера приведен ниже.Если у кого-либо есть понимание того, что может послужить причиной этой ошибки, любая точка зрения будет полезна.

///server side webhook code start///
Router.route('/webhooks/stripe', { where: 'server' })
   .get(function () {
       console.log('getter');
       this.response.end('closing...');
   })
   .post(function () {
       console.log('post function initiated');

       // stores payload as string
       var obj = this.request.body;

       console.log("print obj var");
       console.log(obj);

       // saves as indented string to send as response
       var json = EJSON.stringify(obj, {indent: true});

       this.response.writeHead(200, {
           'Content-Length': json.length,
           'Content-Type': 'application/json'
       });

       this.response.end(json);
   })
   .put(function () {
       console.log('put');
   });

///server side webhook code end///

1 Ответ

0 голосов
/ 19 декабря 2018

Мне удалось решить эту проблему.Для справки и потомков я удалил закомментированный код ниже и вручную добавил свой код состояния (то есть this.response.statusCode = 200;).Это заставило вещи работать и решило проблему.

///code snippet start///
var json = EJSON.stringify(obj, {indent: true});

   //this is the code i removed
       // this.response.writeHead(200, {
       //     'Content-Length': json.length,
       //     'Content-Type': 'application/json'
       // });

   //this is the code i added to send a manual status code
       this.response.statusCode = 200;

       this.response.end(json);
///code snippet end///
...