J'ai une page qui récupère 100 mèmes à partir d'une API. Il affiche les mèmes dans un tableau et chaque mème possède un bouton de détails qui amène l'utilisateur à la page de détails du mème. Je dois effectuer une requête POST sur la route du mème et afficher la page de détails du mème. La demande de publication réussit, mais la page mème n'est pas rendue depuis render() dans router.post.
Meme.js
var express = require("express"); var router = express.Router(); var bodyParser = require("body-parser"); var jsonParser = bodyParser.json(); var ensureLogIn = require("connect-ensure-login").ensureLoggedIn; var ensureLoggedIn = ensureLogIn(); router.post("/", ensureLoggedIn, jsonParser, (req, res, next) => { const meme = req.body.meme; const user = req.body.user; try { res.render("meme", { meme: meme, user: user }); } catch (error) { console.error(error); res.status(500).send("Internal Server Error"); } }); module.exports = router;Bouton
memes.egs :
<tbody> <% memes.forEach(meme=> { %> <tr class="meme-row <%= viewedMemeIds.includes(meme.id) ? 'viewed' : '' %>" data-meme-id="<%= meme.id %>"> <td><img src="<%= meme.url %>" alt="<%= meme.name %>"></td> <td> <%= meme.name %> </td> <% if (user) { %> <td> <button class="btn-meme details-button" onclick="handleDetailsClick(<%= JSON.stringify(meme) %>, <%= JSON.stringify(user) %>)">Details</button> </td> <% } %> </tr> <% }) %> </tbody>
MemeDetails.js :
async function handleDetailsClick(meme, user) { try { // Make a POST request to the meme route with the meme and user data const response = await fetch("/meme", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ meme, user }), }); // Handle the response status if (!response.ok) { throw new Error("Network response was not ok"); } } catch (error) { // Handle any errors console.error(error); } }
La réponse dans le terminal est : POST /meme 200 10,677 ms - 2703, mais rien n'est rendu sur la page.
Je tiens d’abord à mentionner « mais rien n’est rendu sur la page ».
Il ne rendra jamais automatiquement la page, comme il est souligné dans MDN Webdocs que dans
fetch()
用于使用 AJAX 调用从网络获取资源。您获取的资源将存储在response
variables, vous devez gérer manuellement les données que vous obtenez (soit en manipulant le DOM à l'intérieur du texte, soit en redirigeant vers une autre page, par exemple en utilisantwindow.href .emplacement )
Cependant, les requêtes POST sont généralement utilisées pour créer/modifier des données sur le serveur (veuillez lire Méthodes HTTP). Je vois que vous utilisez la requête POST pour afficher la page/accéder à une autre page. GET est la méthode HTTP utilisée pour demander des données au serveur.
Je pense que vous feriez mieux de changer la façon dont vous gérez
Ou modifiez simplement le comportementhandleDetailsClick
的方式。您可以使用或者简单地修改
元素的
onclick
行为,使其具有window.location.href=".../meme?id= "
handleDetailsClick. Au lieu de transmettre l'intégralité des données du mème, vous pouvez utiliser des éléments HTML tels queonclick de l'élément
pour avoir window.location.href=".../meme?id= "
Ensuite, du côté Express, vous pouvez modifier la route POST en GET et obtenir l'ID spécifique dans la chaîne de requête afin de pouvoir le rechercher dans une base de données, etc. et afficher la page en utilisant
Comme vous avez mentionné les exigences de distribution, vous pouvez légèrement modifier le code de routage POST ci-dessus (vous pouvez utiliser uniquement l'ID ou l'intégralité des données, selon les exigences de distribution) au lieu d'utiliserres.render ()
要渲染 html 页面,您只需使用res.JSON()
Mise à jourres.render () pour To rendre une page html, il vous suffit d'utiliser
res.JSON() et de profiter de la réponseJSON