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
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.
Commentaire le plus utile
Je vois aussi le 404 dans notre projet avec ce qui suit :
Peu importe le contenu du fichier
api/bookings
. Il ne sera jamais touché. J'utilisenow dev
pour exécuter le projet sur localhostMettre à jour
J'ai découvert que cela fonctionnait bien avec le
now dev
mais cela ne fonctionnait pas avec mon fichierserver.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 :