Sendgrid-nodejs: Les substitutions doivent être des chaînes, sinon 400 Bad Request lors de l'envoi

Créé le 31 août 2016  ·  13Commentaires  ·  Source: sendgrid/sendgrid-nodejs

Résumé de la question

Essayer d'envoyer un e-mail en utilisant un modèle + des substitutions qui incluent un entier donne une erreur 400 Bad Request sans explication.

Étapes à suivre pour reproduire

  1. Créez un modèle avec une substitution (par exemple %test% )
  2. Tentative d'envoi de ce modèle en utilisant sendgrid-node où la substitution est un entier

_Expected_ - Un e-mail est envoyé ou une erreur avec des informations sur le problème.

_Actual_ - 400 Bad Request sans détails sur le problème.

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

Voici un exemple de code:

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

Le même code exact sauf avec '42' au lieu de 42 pour la substitution fonctionne.

Bien que ce serait super si SendGrid lui-même ne se trompait pas comme ça (ou expliquait le problème dans le message d'erreur, comme quel champ et qu'il n'a pas été accepté car c'est un nombre), je pense que sendgrid-node pourrait / devrait facilement manipulez-le simplement en remplaçant toString ().

Heureux de soumettre un PR, mais quand je suis allé écrire un test qui échouait, il n'y avait pas de documentation sur la façon d'exécuter les tests, et dans les tests, j'ai vu beaucoup de choses sur les hôtes de test que je n'aurais pas exécutés.

Détails techniques:

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

Commentaire le plus utile

@wizysanjay appelle toString sur vos substitutions avant de passer à la bibliothèque. Par exemple au lieu de:

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

Faites ceci:

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

Tous les 13 commentaires

Salut @rfunduk ,

Merci pour les commentaires détaillés!

Il s'agit d'un problème connu et l'équipe API a un correctif sur son backlog pour fournir une chaîne d'erreur appropriée.

Vous avez raison, nous avons besoin de cela corrigé dans la bibliothèque et nous aimerions votre pull request.

Je suis heureux de vous expliquer comment fonctionnent les tests. Mais d'abord, nous aurons besoin d'un CLA signé: https://github.com/sendgrid/sendgrid-nodejs/blob/master/CONTRIBUTING.md

Merci!

J'ai le même problème. Comment puis-je réparer ça

Merci

@wizysanjay appelle toString sur vos substitutions avant de passer à la bibliothèque. Par exemple au lieu de:

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

Faites ceci:

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

+1

J? ai compris. Merci

Je ne peux pas croire que j'ai passé un après-midi à déboguer avant de tomber sur cela. Une mention substitution must be string dans les docs au moins serait bien… que j'ajouterais moi-même, mais à ce stade, je ne peux même pas trouver où cela irait dans les docs.

Salut @dangerismycat ,

:( pas cool. Ceci est documenté ici , mais ce n'est pas utile pour votre cas d'utilisation.

Nous allons intégrer cela dans la bibliothèque pour que vous n'ayez même pas à vous en soucier. Votre vote a été ajouté pour aider à augmenter la priorité.

Génial, heureux que cela ait augmenté la priorité. Si c'est une solution simple et que vous pouvez m'indiquer la bonne direction (repo ou fichier), je peux m'en occuper.

@dangerismycat ,

Impressionnant! Le correctif irait probablement ici .

@thinkingserious Hm… on dirait que la compilation a échoué. Dois-je mettre à jour des tests associés ou autre chose?

Quelque chose ne va pas avec les builds Travis CI pour ceux qui ne font pas partie de l'organisation SendGrid. Je ne sais pas trop ce qui se passe, mais je vérifierai localement.

Hé, je reçois toujours ce problème sur "@ sendgrid / client": "^ 6.2.1" .
L'envoyer alors que sub est un entier ne fonctionne pas et donne

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

Cependant, lorsque je change de sous dans la requête en ${sub} , cela fonctionnera

Cordialement

Bonjour @Mauyeung ,

Pourriez-vous ouvrir un nouveau numéro? Merci!

Il semble que cela puisse être un bug, car je vois que nous sommes censés convertir cela en une chaîne pour vous sous le capot.

Meilleures salutations,

Elmer

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

umarhussain15 picture umarhussain15  ·  3Commentaires

Loriot-n picture Loriot-n  ·  4Commentaires

wooyah picture wooyah  ·  4Commentaires

nicoasp picture nicoasp  ·  3Commentaires

danielflippance picture danielflippance  ·  4Commentaires