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
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.
Hilfreichster Kommentar
Ich sehe den 404 auch in unserem Projekt mit folgendem:
Der Inhalt der Datei
api/bookings
ist egal. Es wird nie getroffen. Ich verwendenow dev
, um das Projekt auf localhost auszuführenAktualisieren
Ich fand heraus, dass es mit
now dev
funktionierte, aber es funktionierte nicht mit meinerserver.js
Datei, da ich Post-Anfragen nicht bearbeitet hatte. Wenn Sie einfach einen Handler für die Post-Anfrage hinzufügen, funktioniert alles gut: