Sendgrid-nodejs: Замены должны быть строками, иначе 400 Bad Request при отправке

Созданный на 31 авг. 2016  ·  13Комментарии  ·  Источник: sendgrid/sendgrid-nodejs

Резюме проблемы

Попытка отправить электронное письмо с использованием шаблона + замены, включающей целое число, дает ошибку 400 Bad Request без объяснения причин.

Действия по воспроизведению

  1. Создайте шаблон с заменой (например, %test% )
  2. Попытка отправить этот шаблон с помощью sendgrid-node, где подстановка является целым числом

_Expected_ - электронное письмо отправлено или ошибка с информацией о проблеме.

_Actual_ - 400 неверный запрос без подробных сведений о проблеме.

SENDMAIL ERROR { statusCode: 400,
  body: '{"errors":[{"message":"Bad Request","field":null,"help":null}]}',
  headers:
   { server: 'nginx',
     date: 'Wed, 31 Aug 2016 14:32:57 GMT',
     'content-type': 'application/json',
     'content-length': '63',
     connection: 'close',
     'x-frame-options': 'DENY' } }

Вот пример кода:

var mail = new helper.Mail()
mail.setFrom( new helper.Email( '[email protected]' ) )
mail.setTemplateId( "THE_TEMPLATE_ID" )

var personalization = new helper.Personalization()
personalization.addTo( new helper.Email( '[email protected]' ) )
var sub = new helper.Substitution( `%test%`, 42 )
personalization.addSubstitution( sub )
mail.addPersonalization( personalization )

sgClient.API( sgClient.emptyRequest( {
  method: 'POST',
  path: '/v3/mail/send',
  body: mail.toJSON()
} ) ).catch( function( err ) {
  console.error( 'SENDGRID ERROR', err.response )
} )

Точно такой же код за исключением '42' вместо 42 для замены работает.

Хотя было бы здорово, если бы сам SendGrid не выдавал такой ошибки (или объяснял бы проблему в сообщении об ошибке, например, какое поле и что оно не было принято, потому что это число), я думаю, что sendgrid-node может / должен легко справиться с этим, просто заменив toString ().

Рад представить PR, но когда я пошел и написал провальный тест, не было документации о том, как запускать тесты, и в тестах я увидел много вещей о тестовых хостах, которые я бы не запускал.

Технические подробности:

  • sendgrid-nodejs Версия: 2.2.1
  • Node.js Версия: 4.1.0
hacktoberfest help wanted community enhancement

Самый полезный комментарий

@wizysanjay вызывает toString для ваших замен перед передачей в библиотеку. Например вместо:

personalization.addSubstitution( new helper.Substitution( `%number%`, number ) )

Сделай это:

personalization.addSubstitution( new helper.Substitution( `%number%`, number.toString() ) )

Все 13 Комментарий

Привет @rfunduk ,

Спасибо за подробный отзыв!

Это известная проблема, и у группы API есть исправление для своего невыполненного журнала, чтобы предоставить соответствующую строку ошибки.

Вы правы, нам нужно исправить это в библиотеке, и мы будем рады вашему запросу на перенос.

Я с удовольствием расскажу вам, как работают тесты. Но сначала нам понадобится подписанный CLA: https://github.com/sendgrid/sendgrid-nodejs/blob/master/CONTRIBUTING.md

Спасибо!

У меня та же проблема. Как я могу это исправить

Спасибо

@wizysanjay вызывает toString для ваших замен перед передачей в библиотеку. Например вместо:

personalization.addSubstitution( new helper.Substitution( `%number%`, number ) )

Сделай это:

personalization.addSubstitution( new helper.Substitution( `%number%`, number.toString() ) )

+1

Я понял. Спасибо

Не могу поверить, что потратил полдня на отладку, прежде чем наткнулся на это. Упоминание substitution must be string в документации по крайней мере было бы неплохо… что я бы добавил сам, но на данный момент я даже не могу найти, где это будет происходить в документации.

Привет @dangerismycat!

:( Не круто. Это задокументировано здесь , но в вашем случае это не поможет.

Мы собираемся встроить это в библиотеку, так что вам даже не нужно об этом беспокоиться. Ваш голос был добавлен, чтобы повысить приоритет.

Замечательно, рад, что это повысило приоритет. Если это простое исправление, и вы можете указать мне правильное направление (репо или файл), я могу об этом позаботиться.

@dangerismycat ,

Потрясающие! Исправление, скорее всего, будет здесь .

@thinkingserious Хм ... похоже, сборка не удалась. Есть ли связанные тесты, которые мне нужно обновить, или что-то еще?

Что-то было не так со сборками Travis CI для тех, кто не работает в организации SendGrid. Я не совсем уверен, что происходит, но проверю на месте.

Эй, проблема все еще возникает на
Отправка этого, когда sub является целым числом, не работает и дает

body: {
  personalizations: [{
    to: [{
      email: userEmail
    }],
    subject: `blah blah blah`,
    substitutions: {
      '{{sub}}': sub
    }
  }],
  from: {
    email: '[email protected]',
    name: 'blah blah'
  },
  template_id
}
err { Error: Bad Request
    at Request.http [as _callback] (node_modules/@sendgrid/client/src/classes/client.js:124:25)
    at Request.self.callback (node_modules/request/request.js:186:22)
    at emitTwo (events.js:126:13)
    at Request.emit (events.js:214:7)
    at Request.<anonymous> (node_modules/request/request.js:1163:10)
    at emitOne (events.js:116:13)
    at Request.emit (events.js:211:7)
    at IncomingMessage.<anonymous> (node_modules/request/request.js:1085:12)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1055:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)
  code: 400,
  message: 'Bad Request',
  response: 
   { headers: 
      { server: 'nginx',
        date: 'Fri, 20 Apr 2018 16:17:42 GMT',
        'content-type': 'application/json',
        'content-length': '63',
        connection: 'close',
        'access-control-allow-origin': 'https://sendgrid.api-docs.io',
        'access-control-allow-methods': 'POST',
        'access-control-allow-headers': 'Authorization, Content-Type, On-behalf-of, x-sg-elas-acl',
        'access-control-max-age': '600',
        'x-no-cors-reason': 'https://sendgrid.com/docs/Classroom/Basics/API/cors.html' },
     body: { errors: [Array] } } }
where the errors: array is [ { message: 'Bad Request', field: null, help: null } ]

Однако, когда я изменяю подпункт в запросе на ${sub} , он будет работать

С Уважением

Привет @Mauyeung ,

Не могли бы вы открыть новый номер? Спасибо!

Похоже, это может быть ошибка, поскольку я вижу, что мы должны преобразовать это в строку для вас под капотом.

С наилучшими пожеланиями,

Элмер

Была ли эта страница полезной?
0 / 5 - 0 рейтинги