Sendgrid-nodejs: рд╕рдмреНрд╕реНрдЯрд┐рдЯреНрдпреВрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднреЗрдЬрддреЗ рд╕рдордп 400 рдЦрд░рд╛рдм рдЕрдиреБрд░реЛрдз

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЕрдЧре░ 2016  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sendgrid/sendgrid-nodejs

рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╛рд░реА рдХрд░реЛ

рдЯреЗрдореНрдкреНрд▓реЗрдЯ + рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, 400 рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд┐рдирд╛ рдЦрд░рд╛рдм рдЕрдиреБрд░реЛрдз рджреЗрддрд╛ рд╣реИред

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛

  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 рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ / рдЪрд╛рд╣рд┐рдП рдЗрд╕реЗ рд╕рд┐рд░реНрдл рд╕реНрдЯреНрд░реАрдВрдЧ () - рдЖрдИрдПрдирдЬреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓реЗрдВред

рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдПрдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдерд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреЛрдИ рдбреЙрдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдЯреЗрд╕реНрдЯ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рджреЗрдЦреАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирд╣реАрдВ рдЪрд▓рд╛рдКрдВрдЧрд╛ред

рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА:

  • 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 ,

рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдПрдХ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдПрдкреАрдЖрдИ рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдПрдХ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдмреИрдХрд▓реЙрдЧ рдкрд░ рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИред

рдЖрдк рд╕рд╣реА рд╣реИрдВ, рд╣рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдЖрдкрдХреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╕рдВрдж рдЖрдПрдЧрд╛ред

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 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 ,

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдареАрдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдпрд╣рд╛рдБ ред

@thinkings рд░рд╣рд╕реНрдпрдордп рдПрдЪрдПрдо ... рдмрд┐рд▓реНрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рд╡рд┐рдлрд▓ред рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рдФрд░?

рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдЬреЛ SendGrid рд╕рдВрдЧрдарди рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реВрдВрдЧрд╛ред

рдЕрд░реЗ, рдЕрднреА рднреА "@ рдкреНрд░реЗрд╖рдХ / рдЧреНрд░рд╛рд╣рдХ" рдкрд░ рдпрд╣ рдореБрджреНрджрд╛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ
рдпрд╣ рд╕рдм рднреЗрдЬрддреЗ рд╕рдордп рдЙрдк рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЗрддрд╛ рд╣реИ

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} рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЙрдк рдмрджрд▓рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛

рд╕рд╛рджрд░

рдирдорд╕реНрдХрд╛рд░ @ рдордпрдпреБрдВрдЧ ,

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдорди рдХрд░реЗрдВрдЧреЗ? рдзрдиреНрдпрд╡рд╛рдж!

рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╣реБрдб рдХреЗ рддрд╣рдд рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред

рд╢реБрднрдХрд╛рдордирд╛рдПрдВ,

рдПрд▓реНрдорд░

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

murphman300 picture murphman300  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

polkhovsky picture polkhovsky  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zvone187 picture zvone187  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

prasoonjalan picture prasoonjalan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

TobiahRex picture TobiahRex  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ