Ошибка JSON / EJSON с API Stripe - событие Invoice Webhook

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

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

Stripe, не связанное с фактурой: 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: true}));" выдает ошибки - подробности см. ниже. б) "this.response.end (EJSON.stringify (obj));" нет ошибки на локальном сервере, ошибка на панели инструментов полосы с «невозможно подключиться» и не возвращает код 200

Любое понимание будет оценено.

У меня возникли проблемы с Stripe API, и мне нужна помощь или понимание. Я использую 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///
  1. На моей панели управления Stripe я получаю сообщение об ошибке: 'Test webhook error: Unable to connect'

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

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

И последнее: чтобы запустить 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///

person Mike    schedule 18.12.2018    source источник
comment
Просто любопытно, до какого шага выдает ошибку? console.log(obj); печатает что-нибудь до появления ошибки?   -  person wsw    schedule 18.12.2018
comment
Привет @wsw. он выдает ошибку на this.response.end (json); Я смог подтвердить это через несколько журналов консоли. Для меня странно то, что код работал ранее в тот же день, а затем внезапно для типа события счета-фактуры код ломался и выдавал ошибку - все другие типы событий работали.   -  person Mike    schedule 18.12.2018


Ответы (1)


Мне удалось решить эту проблему. Для справки и потомков я удалил закомментированный код ниже и вручную добавил свой код статуса (т.е. 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///
person Mike    schedule 19.12.2018