首页 > 解决方案 > TypeError: req.flash is not a function -- (NodeJs) (connect-flash) -- 我无法打开页面

问题描述

当我尝试从页面登录时,出现错误

类型错误:req.flash 不是函数

我解释了我得到的错误和我尝试过的方法

  1. 如果我删除console.log (req.flash ("validation_error"))auth_controller 文件中名为“registerFormunuGoster”的函数中的这段代码,我可以在第一步中成功链接到页面。如果我不删除此代码,我无法在第一步中成功连接到页面。

  2. 我上面提到的文字被翻译成下面的代码。

  3. const registerFormunuGoster = (req, res) => { res.render("register", { layout: "./layout/auth_layout" ,}) }

  4. 假设我编写了上面提到的代码并打开了页面,然后我在页面上填写了表单,并且每当我在填写表单后按下提交按钮时都会收到相同的错误。为了解决这个问题,在 auth_controller.js 文件下如果我在名为“register”的函数中删除代码“req.flash (“validation_error”,errors)”,这次我会得到一个不同的错误。我留下另一个错误我到下面。我想我得到这样一个错误的原因一定是因为我做了 res.redirect()。

  5. 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头

  6. 我在第 4 项中提到的事件被翻译成下面的代码。

  7. `const register = (req, res) => { const hatalar = validationResult(req);

     if (!hatalar.isEmpty()) {
         res.redirect("/register")
     }
     res.render("register", { layout: "./layout/auth_layout" ,})
    

    }`

下面是我的 app.js 和 auth_controller.js 配置

应用程序.js

const express = require("express")
const app = express()
const dotenv = require("dotenv").config()
const session = require("express-session")
const flash = require("connect-flash")
// database bağlantısı - veritabanı bağlantısı 
require("./src/config/database")

// TEMPALTE ENGİNE AYARALARI 
const ejs = require("ejs")
const expressLayouts = require("express-ejs-layouts")
const path = require("path")
app.set("view engine", "ejs")
app.set("views", path.resolve(__dirname, "./src/views"))
app.use(express.static("public"))
app.use(expressLayouts)


// routerlar include edilip kullanılır 
const authRouter = require("./src/routers/auth_router")
app.use("/", authRouter)


// formdan yollanılan verileri json a çevirip verilere dönüşmesi için bu şart
app.use(express.urlencoded({ extended: true }))


//* const session = require("express-session")
//* Seesion ve flash message
//* bunları yapmak için yukarıdaki modul lazım
//? önemli bir not çıldıurmak üzereydim kodlar çalışmıyordu kodların çalışması üçün üst sıralar çekince oldu bakalım neyden kaynaklanıyorumuş deneyerek bulucam 
//? app.get gibi sunucu istekleri yönlendirmeden önce kullanılması lazımmış
app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge:1000*5
    }
    //* maxAge: verilen cookienin ne kadar zaman sonra kendisini ihma etmesini söylüyor
    //* saniye cinsinden verdik 
}))
//? flash mesajlarının middleware olarak kullanılmasını sağladık yani aldığımız hatayı flash sayesinde kullanabilceğiz
app.use(flash())


let sayac = 0
app.get("/", (req, res) => {
    if (!req.session.sayac) {
        req.session.sayac = 1
    } else {
        req.session.sayac++
    }
    res.json({ message: "Hello World", sayac: req.session.sayac })
})



app.listen(process.env.PORT, _ => console.log(`Server started at ${process.env.PORT} port `))

auth_controller.js:

const { validationResult } = require("express-validator")

const loginFormunuGoster = (req, res) => {
    res.render("login", { layout: "./layout/auth_layout" })
}
const login = (req, res) => {
    res.render("login", { layout: "./layout/auth_layout" })
}



const registerFormunuGoster = (req, res) => {
    // console.log(req.flash("validation_error"))
    res.render("register", { layout: "./layout/auth_layout" ,})
}
const register = (req, res) => {
    const hatalar = validationResult(req);

// req.body adı altında girilen veriler gözüküyor
// console.log(req.body) 
// console.log(hatalar)
    if (!hatalar.isEmpty()) {
        // req.flash("validation_error",hatalar)
        res.redirect("/register")
    }
    res.render("register", { layout: "./layout/auth_layout" ,})
}


const forgetPasswordFormunuGoster = (req, res) => {
    res.render("forget_password", { layout: "./layout/auth_layout" })
}
const forgetPassword = (req, res) => {
    res.render("forget_password", { layout: "./layout/auth_layout" })
}


module.exports = {
    loginFormunuGoster,
    registerFormunuGoster,
    forgetPasswordFormunuGoster,
    register,
    login,
    forgetPassword,
}

我真的很感谢大家的帮助!!! 我希望我能很好地解释我收到的错误

标签: javascriptnode.jsexpressexpress-sessionconnect-flash

解决方案


我认为您的问题来自对如何将请求发回的误解。

您遇到的第二个错误“错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头”表示您尝试再次操作的请求已经完成(您可以在此处阅读更好的解释:错误:无法设置发送到客户端后的标头

因此,在您的情况下,您不能在同一个请求中执行 a.redirect和 a 。.render

对于您的初始错误,似乎 flash 没有附加到req对象上。我不确定,但这可能是因为您在路由器之后需要它,并且在使用它时还没有准备好。那里:

// 'use' it before you require your auth_router
app.use(flash());

// then require your auth_controller.js file somewhere in this
const authRouter = require("./src/routers/auth_router")
app.use("/", authRouter)

阅读 connect-flash 文档以获取有关如何使用它的更多说明:https ://www.npmjs.com/package/connect-flash


推荐阅读