为什么 res.render 在发布请求后不起作用?

问题描述 投票:0回答:1

我已经尝试解决这个问题有一段时间了。问题实际上是,当我通过 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");
});

javascript node.js express rendering ejs
1个回答
0
投票

因为post请求不是为了渲染页面。 Post请求用于数据传输。就像休息 API 一样。你应该使用 res。

所以你应该使用 res.write 而不是 res.render。

或者发送GET请求进行渲染。

附注我对我糟糕的英语水平感到非常抱歉。

© www.soinside.com 2019 - 2024. All rights reserved.