Next.js: La route API Next.js 9 fonctionne sur Get Request mais pas sur Post request

CrĂ©Ă© le 14 juil. 2019  Â·  23Commentaires  Â·  Source: vercel/next.js

Question sur Next.js

J'essaie de modifier certaines API pour utiliser post au lieu de get.
J'ai un code de requĂȘte comme celui-ci avec une rĂ©cupĂ©ration normale

 const response = await fetch(`${process.env.SERVER}/api/lyric?id=${song.song_id}`);

Il accédera au fichier à l'intérieur de ./page/api et se résoudra, cependant, si je passe au code suivant

 const response = await fetch(`${process.env.SERVER}/api/lyric`, {
                    method: 'POST',
                    body: JSON.stringify({id: song.song_id})
                });

Cela me donnera 404 non trouvé. Je me demande quel est le problÚme ici ?

Merci

Commentaire le plus utile

Je vois aussi le 404 dans notre projet avec ce qui suit :

const res = await fetch('/api/bookings', {
  method: 'POST',
  body: JSON.stringify({ hungry: true }),
  headers: {
    'Content-Type': 'application/json',
  },
})
const data = await res.json()

Peu importe le contenu du fichier api/bookings . Il ne sera jamais touché. J'utilise now dev pour exécuter le projet sur localhost

Mettre Ă  jour
J'ai découvert que cela fonctionnait bien avec le now dev mais cela ne fonctionnait pas avec mon fichier server.js car je n'avais pas traité les demandes de publication. Si vous ajoutez simplement un gestionnaire pour la demande de publication, tout fonctionnera correctement :

server.post('*', (req, res) => {
  return handle(req, res)
})

Tous les 23 commentaires

Hé @ zluo01 , fournissez une reproduction complÚte, à partir de votre problÚme, il est difficile de deviner ce qui pourrait ne pas aller. Vous pouvez vérifier le test d'intégration pour POST .

Avez-vous pu comprendre cela? La documentation pour les routes API est assez minime, et je reçois Ă©galement une rĂ©ponse 404 pour les requĂȘtes POST envoyĂ©es Ă  une route qui a bien fonctionnĂ© pour les requĂȘtes GET

Avez-vous pu comprendre cela? La documentation pour les routes API est assez minime, et je reçois Ă©galement une rĂ©ponse 404 pour les requĂȘtes POST envoyĂ©es Ă  une route qui a bien fonctionnĂ© pour les requĂȘtes GET

DĂ©solĂ© non, j'utilise plutĂŽt Get and put stuff dans les en-tĂȘtes et je n'ai pas le temps de produire une reproduction complĂšte.

Une documentation sur la gestion du POST serait utile

@stoplion que voudriez-vous documenter ? Pouvez-vous créer un problÚme en suivant le modÚle de problÚme correspondant ?

Sûr

Je vois aussi le 404 dans notre projet avec ce qui suit :

const res = await fetch('/api/bookings', {
  method: 'POST',
  body: JSON.stringify({ hungry: true }),
  headers: {
    'Content-Type': 'application/json',
  },
})
const data = await res.json()

Peu importe le contenu du fichier api/bookings . Il ne sera jamais touché. J'utilise now dev pour exécuter le projet sur localhost

Mettre Ă  jour
J'ai découvert que cela fonctionnait bien avec le now dev mais cela ne fonctionnait pas avec mon fichier server.js car je n'avais pas traité les demandes de publication. Si vous ajoutez simplement un gestionnaire pour la demande de publication, tout fonctionnera correctement :

server.post('*', (req, res) => {
  return handle(req, res)
})

@TommySorensen cela devrait ĂȘtre corrigĂ© dans le dernier canari

Cela a-t-il déjà été répondu ? Existe-t-il un moyen de POST sur une route API Next v9 ?

Cela a-t-il déjà été répondu ? Existe-t-il un moyen de POST sur une route API Next v9 ?

Oui. La simple publication sur les routes API fonctionnera trĂšs bien. Utilisez cet exemple et modifiez le get to post. C'est ce que j'ai fait. A fonctionnĂ© comme un charme 😉

@huv1k une idée sur une sortie ?

@lifeiscontent sortie de quoi ?

@huv1k quand la prochaine version de next.js sortira avec ce correctif

@lifeiscontent Il n'y a aucun bogue Ă  corriger. Je l'ai testĂ© moi-mĂȘme. POST fonctionne trĂšs bien si vous utilisez les exemples NextJS. C'est bien quelque chose dans votre application. Veuillez fournir un exemple de code complet, afin que nous puissions vous aider dans l'enquĂȘte 👍

facile
dans votre _serveur personnalisé_
faire

server.use((req, res) => app.getRequestHandler()(req, res))

Reproduction :

npx create-next-app --example with-firebase-authentication with-firebase-authentication-app

Ajouter le fichier api/test.js

export default (req, res) => {
  console.log('api test', req.method)
  res.json('ok')
}

Ajoutez un gestionnaire de requĂȘtes dans server.js :

server.use((req, res) => app.getRequestHandler()(req, res))

Courez yarn dev (ou node server.js )

Envoyer POST Ă  http://localhost :3000/api/test

Attendu : journaux de la console api test POST
Réel : aucun journal, la demande reste en attente jusqu'à expiration du délai

Vous devez mettre à jour l'exemple :

  server.get('*', (req, res) => {
    return handle(req, res)
  })

doit ĂȘtre :

  server.all('*', (req, res) => {
    return handle(req, res)
  })

J'ai trouvé notre erreur : mettre isomorphic-unfetch niveau

Au fait, la dépendance de Firebase est assez ancienne :

 firebase             ^5.6.0  →    ^7.2.1
 firebase-admin       ^5.8.2  →    ^8.6.1

Si quelqu'un rencontre déjà ce problÚme avec un serveur express personnalisé, cela peut se produire lors de l'utilisation de plusieurs analyseurs de corps, car les routes api NextJs l'activent par défaut. Utilisez uniquement l'analyseur de corps express, ou uniquement l'analyseur de corps NextJs. Comment désactiver l'analyseur de corps NextJs documenté ici : https://nextjs.org/docs#api -middlewares

@epranka @thgh , Mec, il m'a fallu des heures pour comprendre celui-ci.

J'utilise le serveur Firebase Cloud Functions et je n'ai pas pu envoyer de requĂȘtes POST Ă  ​​ma route API. Les requĂȘtes POST se bloqueraient, mais les requĂȘtes GET fonctionneraient correctement. Et si j'utilisais le serveur de dĂ©veloppement local NextJS, les requĂȘtes POST fonctionneraient Ă©galement correctement.

La désactivation de l'analyseur de corps lors de l'utilisation de Firebase Cloud Functions l'a corrigé.

Apparemment, Firebase Cloud Functions est livré avec son propre analyseur de corps, et il est en conflit avec celui de NextJS. Vous devez donc désactiver l'analyseur de corps pour Firebase Cloud Functions, mais l'activer pour le développement local à l'aide du serveur de développement NextJS.

Donc, en gros, déposez ceci dans votre pages/api/[yourEndPoint].js :

export const config = {
  api: {
    bodyParser: process.env.NODE_ENV !== 'production'
  }
};

La réponse de

  server.get("*", (req, res) => handle(req, res));
  server.post("*", (req, res) => handle(req, res));

Merci beaucoup!

@epranka @thgh , Mec, il m'a fallu des heures pour comprendre celui-ci.

J'utilise le serveur Firebase Cloud Functions et je n'ai pas pu envoyer de requĂȘtes POST Ă  ​​ma route API. Les requĂȘtes POST se bloqueraient, mais les requĂȘtes GET fonctionneraient correctement. Et si j'utilisais le serveur de dĂ©veloppement local NextJS, les requĂȘtes POST fonctionneraient Ă©galement correctement.

La désactivation de l'analyseur de corps lors de l'utilisation de Firebase Cloud Functions l'a corrigé.

Apparemment, Firebase Cloud Functions est livré avec son propre analyseur de corps, et il est en conflit avec celui de NextJS. Vous devez donc désactiver l'analyseur de corps pour Firebase Cloud Functions, mais l'activer pour le développement local à l'aide du serveur de développement NextJS.

Donc, en gros, déposez ceci dans votre pages/api/[yourEndPoint].js :

export const config = {
  api: {
    bodyParser: process.env.NODE_ENV !== 'production'
  }
};

Merci! Était confrontĂ© exactement au mĂȘme problĂšme. RĂ©solu avec votre correctif. Il est surprenant que les fonctions Firebase ne donnent aucune configuration pour dĂ©sactiver l'analyse automatique du corps.

nous devons donc utiliser un serveur personnalisé, mais obtenir le corps analysé dans la route api aurait résolu de nombreux problÚmes.

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

Questions connexes

timneutkens picture timneutkens  Â·  3Commentaires

olifante picture olifante  Â·  3Commentaires

flybayer picture flybayer  Â·  3Commentaires

swrdfish picture swrdfish  Â·  3Commentaires

knipferrc picture knipferrc  Â·  3Commentaires