Next.js: Die API-Route von Next.js 9 funktioniert bei Get Request, aber nicht bei Post Request

Erstellt am 14. Juli 2019  ·  23Kommentare  ·  Quelle: vercel/next.js

Frage zu Next.js

Ich versuche, einige der APIs so zu ändern, dass sie post statt get verwenden.
Ich habe einen Anfragecode wie diesen mit normalem Abruf

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

Es wird jedoch zur Datei in ./page/api gelangen und aufgelöst, wenn ich zum folgenden Code ändere

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

Es wird mir 404 nicht gefunden geben. Ich frage mich, was ist hier das Problem?

Dankeschön

Hilfreichster Kommentar

Ich sehe den 404 auch in unserem Projekt mit folgendem:

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

Der Inhalt der Datei api/bookings ist egal. Es wird nie getroffen. Ich verwende now dev , um das Projekt auf localhost auszuführen

Aktualisieren
Ich fand heraus, dass es mit now dev funktionierte, aber es funktionierte nicht mit meiner server.js Datei, da ich Post-Anfragen nicht bearbeitet hatte. Wenn Sie einfach einen Handler für die Post-Anfrage hinzufügen, funktioniert alles gut:

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

Alle 23 Kommentare

Hey @zluo01 , stellen Sie eine vollständige Reproduktion zur Verfügung, aus Ihrem Problem ist es schwer zu erraten, was falsch sein könnte. Sie können den Integrationstest für POST überprüfen.

Konnten Sie das herausfinden? Die Dokumentation für API-Routen ist ziemlich minimal, und ich erhalte auch eine 404-Antwort für POST-Anfragen, die an eine Route gesendet werden, die für GET-Anfragen gut funktioniert hat

Konnten Sie das herausfinden? Die Dokumentation für API-Routen ist ziemlich minimal, und ich erhalte auch eine 404-Antwort für POST-Anfragen, die an eine Route gesendet werden, die für GET-Anfragen gut funktioniert hat

Tut mir leid, nein, ich verwende stattdessen Get und setze Sachen in Header und habe keine Zeit, eine vollständige Reproduktion zu erstellen.

Eine Dokumentation zum Umgang mit POST wäre hilfreich

@stoplion was

Sicher

Ich sehe den 404 auch in unserem Projekt mit folgendem:

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

Der Inhalt der Datei api/bookings ist egal. Es wird nie getroffen. Ich verwende now dev , um das Projekt auf localhost auszuführen

Aktualisieren
Ich fand heraus, dass es mit now dev funktionierte, aber es funktionierte nicht mit meiner server.js Datei, da ich Post-Anfragen nicht bearbeitet hatte. Wenn Sie einfach einen Handler für die Post-Anfrage hinzufügen, funktioniert alles gut:

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

@TommySorensen das sollte im neuesten Kanarienvogel behoben sein

Wurde das jemals beantwortet? Gibt es eine Möglichkeit zum POST auf eine nächste v9 API-Route?

Wurde das jemals beantwortet? Gibt es eine Möglichkeit zum POST auf eine nächste v9 API-Route?

Jawohl. Nur das Posten auf den API-Routen wird gut funktionieren. Verwenden Sie dieses Beispiel und ändern Sie das Get-to-Post. Das ist, was ich tat. Hat wie ein Zauber funktioniert

@huv1k eine Idee zu einer Veröffentlichung?

@lifeiscontent Veröffentlichung von was?

@huv1k, wann die nächste Version von next.js mit diesem Fix herauskommt

@lifeiscontent Es gibt keinen zu

leicht deasy
in Ihrem _benutzerdefinierten Server_
tun

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

Repro:

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

Datei api/test.js hinzufügen

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

Anfragehandler in server.js hinzufügen:

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

yarn dev (oder node server.js )

Senden Sie POST an http://localhost :3000/api/test

Erwartet: Konsolenprotokolle api test POST
Aktuell: keine Protokolle, Anfrage bleibt bis zum Timeout ausstehend

Sie müssen das Beispiel aktualisieren:

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

muss sein:

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

Wir haben unseren Fehler gefunden: Upgrade von isomorphic-unfetch => NICHT UPGRADE 🤕

Übrigens ist die Firebase-Abhängigkeit ziemlich alt:

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

Wenn dieses Problem noch bei einem benutzerdefinierten Expressserver auftritt, kann es bei der Verwendung mehrerer Body-Parser auftreten, da die API-Routen von NextJ dies standardmäßig aktivieren. Verwenden Sie nur den Express-Body-Parser oder nur den NextJs-Body-Parser. Wie man den dort dokumentierten Body-Parser von NextJ deaktiviert: https://nextjs.org/docs#api -middlewares

@epranka @thgh , Mann, ich habe Stunden

Ich verwende den Firebase Cloud Functions-Server und konnte keine POST-Anfragen an meine API-Route stellen. POST-Anfragen würden hängen bleiben, aber GET-Anfragen würden gut funktionieren. Und wenn ich den lokalen NextJS-Entwicklungsserver verwenden würde, würden POST-Anfragen auch gut funktionieren.

Das Deaktivieren des Body-Parsers bei der Verwendung von Firebase Cloud Functions hat das Problem behoben.

Anscheinend verfügt Firebase Cloud Functions über einen eigenen Body-Parser, der mit dem von NextJS in Konflikt steht. Sie müssen also den Body-Parser für Firebase Cloud Functions deaktivieren, ihn jedoch für die lokale Entwicklung mit dem NextJS-Entwicklungsserver aktivieren.

Lassen Sie dies also im Grunde in Ihrem pages/api/[yourEndPoint].js :

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

@TommySorensen Antwort hat es für mich gelöst:

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

Vielen Dank!

@epranka @thgh , Mann, ich habe Stunden

Ich verwende den Firebase Cloud Functions-Server und konnte keine POST-Anfragen an meine API-Route stellen. POST-Anfragen würden hängen bleiben, aber GET-Anfragen würden gut funktionieren. Und wenn ich den lokalen NextJS-Entwicklungsserver verwenden würde, würden POST-Anfragen auch gut funktionieren.

Das Deaktivieren des Body-Parsers bei der Verwendung von Firebase Cloud Functions hat das Problem behoben.

Anscheinend verfügt Firebase Cloud Functions über einen eigenen Body-Parser, der mit dem von NextJS in Konflikt steht. Sie müssen also den Body-Parser für Firebase Cloud Functions deaktivieren, ihn jedoch für die lokale Entwicklung mit dem NextJS-Entwicklungsserver aktivieren.

Lassen Sie dies also im Grunde in Ihrem pages/api/[yourEndPoint].js :

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

Vielen Dank! Hatte genau das gleiche Problem. Mit deinem Fix behoben. Es ist überraschend, dass Firebase-Funktionen keine Konfiguration zum Deaktivieren des automatischen Body-Parsings bereitstellen.

Also müssen wir einen benutzerdefinierten Server verwenden, haben es aber bekommen, aber den geparsten Körper in die API-Route zu bekommen, hätte viele Probleme gelöst.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen