我已经尝试解决这个问题有一段时间了。问题实际上是,当我通过 fetch api 发送 post 请求,然后使用节点 js 文件中的 post 请求捕获它时,它通常应该呈现错误页面,但事实并非如此。这是怎么发生的?
ps:不要介意文字。我是荷兰人。
节点js文件:
const express = require("express");
const { emailFormSchema } = require("./schemas.js");
const rateLimiter = require("express-rate-limit");
if (process.env.NODE_ENV !== "production") {
require("dotenv").config();
}
const bodyParser = require("body-parser");
const app = express();
const path = require("path");
const ExpressError = require("./utils/ExpressError");
const ejsMate = require("ejs-mate");
const nodemailer = require("nodemailer");
const Swal = require("sweetalert2");
const { Console } = require("console");
// Setting up ejs and the stylesheets
app.engine("ejs", ejsMate);
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "/views"));
app.use(express.static(path.join(__dirname, "public")));
// app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.json());
// POST route for form
app.use(express.json());
app.post("/contact", limiter, validateForm, (req, res, next) => {
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.email,
pass: process.env.pass,
},
});
const mailOptions = {
From: req.body.email,
// to moet nog aangepast worden naar mamas email
to: process.env.email,
subject: `Nieuw bericht van ${req.body.email}`,
text: `naam: ${req.body.name},
bericht: ${req.body.message}`,
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
res.send("error token");
} else {
console.log(`mail verzonden: ${info.response}`);
res.send("success");
}
});
});
// HOME
app.get("/", (req, res) => {
res.render("./pages/home.ejs");
});
let message = "";
app.post("/error", (req, res, next) => {
const msg = req.body.message;
message = req.body.message;
console.log("error message is:", msg);
// res.redirect("/error");
res.redirect("/error");
});
app.get("/error", (req, res, next) => {
if (message) {
console.log("hitted");
res.render("./pages/error", { message });
// next(new ExpressError(message, 404));
} else {
next(new ExpressError("Pagina niet gevonden", 404));
}
});
app.all("*", (req, res, next) => {
next(new ExpressError("Pagina niet gevonden", 404));
});
app.use((err, req, res, next) => {
const { statusCode = 500, message } = err;
console.log("Message in error handeler is:", message);
res.render("./pages/error", { message, statusCode });
});
app.listen(3000, () => {
console.log("Listening on port 3000");
});
因为post请求不是为了渲染页面。 Post请求用于数据传输。就像休息 API 一样。你应该使用 res。
所以你应该使用 res.write 而不是 res.render。
或者发送GET请求进行渲染。
附注我对我糟糕的英语水平感到非常抱歉。