Sendgrid-nodejs: Las sustituciones deben ser cadenas, de lo contrario 400 Solicitud incorrecta al enviar

Creado en 31 ago. 2016  ·  13Comentarios  ·  Fuente: sendgrid/sendgrid-nodejs

Resumen de asuntos

Tratar de enviar un correo electrónico usando una plantilla + sustituciones que incluyen un número entero da un error 400 Bad Request sin explicación.

Pasos para reproducir

  1. Cree una plantilla con una sustitución (por ejemplo, %test% )
  2. Intente enviar esa plantilla usando sendgrid-node donde la sustitución es un número entero

_Expected_: se envió un correo electrónico o un error con información sobre el problema.

_Actual_ - 400 Solicitud incorrecta sin detalles sobre el problema.

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' } }

Aquí hay un ejemplo de código:

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 )
} )

El mismo código exacto excepto con '42' lugar de 42 para la sustitución funciona.

Si bien sería genial si SendGrid en sí no cometiera un error como este (o explicara el problema en el mensaje de error, como qué campo y que no fue aceptado porque es un número), creo que sendgrid-node podría / debería fácilmente manejarlo con sólo toString () - sustituciones de ing.

Feliz de enviar un PR, pero cuando fui a escribir una prueba fallida, no hay documentos sobre cómo ejecutar las pruebas, y en las pruebas vi muchas cosas sobre los hosts de prueba que no habría ejecutado.

Detalles técnicos:

  • sendgrid-nodejs Versión: 2.2.1
  • Versión de Node.js: 4.1.0
hacktoberfest help wanted community enhancement

Comentario más útil

@wizysanjay llame a toString en sus sustituciones antes de pasar a la biblioteca. Por ejemplo en lugar de:

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

Hacer esto:

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

Todos 13 comentarios

Hola @rfunduk ,

¡Gracias por los comentarios detallados!

Este es un problema conocido y el equipo de API tiene una solución en su trabajo pendiente para proporcionar una cadena de error adecuada.

Tiene razón, necesitamos que esto se solucione en la biblioteca y nos encantaría su solicitud de extracción.

Me complace explicarle cómo funcionan las pruebas. Pero primero, necesitaremos un CLA firmado: https://github.com/sendgrid/sendgrid-nodejs/blob/master/CONTRIBUTING.md

¡Gracias!

Tengo el mismo problema. Cómo puedo solucionar esto

Gracias

@wizysanjay llame a toString en sus sustituciones antes de pasar a la biblioteca. Por ejemplo en lugar de:

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

Hacer esto:

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

+1

Lo tengo. Gracias

No puedo creer que pasé una tarde depurando antes de encontrarme con esto. Una mención de substitution must be string en los documentos al menos estaría bien ... lo cual agregaría yo mismo, pero en este punto ni siquiera puedo encontrar dónde iría eso en los documentos.

Hola @dangerismycat ,

:( no es genial. Esto está documentado aquí , pero no es útil para su caso de uso.

Vamos a incorporar esto en la biblioteca para que ni siquiera tenga que preocuparse por ello. Su voto se ha agregado para ayudar a aumentar la prioridad.

Impresionante, me alegro de que haya aumentado la prioridad. Si es una solución simple y puede indicarme la dirección correcta (repositorio o archivo), puedo ocuparme de ello.

@dangerismycat ,

¡Increíble! La solución probablemente iría aquí .

@thinkingserious Hm ... parece que la compilación falló. ¿Hay pruebas asociadas que deba actualizar o algo más?

Algo ha ido mal con las compilaciones de Travis CI para aquellos que no están en la organización SendGrid. No estoy muy seguro de lo que está pasando, pero lo verificaré localmente.

Oye, sigo teniendo este problema en "@ sendgrid / client": "^ 6.2.1" .
Enviar esto mientras sub es un número entero no funciona y da

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 } ]

Sin embargo, cuando cambio sub en la solicitud a ${sub} , funcionará

Saludos

Hola @Mauyeung ,

¿Le importaría abrir una nueva edición? ¡Gracias!

Parece que esto puede ser un error, ya que veo que se supone que debemos convertir eso en una cadena debajo del capó.

Con los mejores deseos,

Elmer

¿Fue útil esta página
0 / 5 - 0 calificaciones