TypeError: req.flash is not a function -- (NodeJs) (connect-flash) -- I can not open the page
TypeError: req.flash is not a function -- (NodeJs) (connect-flash) -- I can not open the page
当我尝试从页面登录时,出现错误
TypeError: req.flash is not a function
我解释一下我得到的错误和我尝试的方法
如果我在名为“registerFormunuGoster”的函数中删除这段代码console.log (req.flash ("validation_error"))
auth_controller文件,我可以成功link到页面中
第一步。如果我不删除此代码,我将无法连接到
第一步页面成功。
我上面提到的文字翻译成下面的代码。
const registerFormunuGoster = (req, res) => { res.render("register", { layout: "./layout/auth_layout" ,}) }
假设我写了上面提到的代码并打开了页面,之后我在我的页面上填写了表格,当我在填写表格后按下提交按钮时,我得到了同样的错误。为了解决这个问题,在auth_controller.js文件下如果我删除代码“req.flash(“validation_error“,错误)”在名为“register”的函数中这次我得到一个不同的error.I 我留下了下面的另一个错误。我想我得到这样一个错误的原因一定是因为我做了 res.redirect().
错误[ERR_HTTP_HEADERS_SENT]:发送给客户端后无法设置headers
我在第 4 项中提到的事件被翻译成下面的代码。
`const 寄存器 = (req, res) => {
const hatalar = validationResult(req);
if (!hatalar.isEmpty()) {
res.redirect("/register")
}
res.render("register", { layout: "./layout/auth_layout" ,})
}`
下面是我的app.js和auth_controller.js配置
app.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,
}
非常感谢大家的帮助!!!
我希望我解释清楚我收到的错误
我认为您的问题是由于误解了您应该如何发回请求。
您遇到的第二个错误 'Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client' 表明您再次尝试操作的请求已经完成(您可以在此处阅读更好的解释:Error: Can't set headers after they are sent to the client)
所以在你的情况下,你不能在同一个请求中执行 .redirect
和 .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
当我尝试从页面登录时,出现错误
TypeError: req.flash is not a function
我解释一下我得到的错误和我尝试的方法
如果我在名为“registerFormunuGoster”的函数中删除这段代码
console.log (req.flash ("validation_error"))
auth_controller文件,我可以成功link到页面中 第一步。如果我不删除此代码,我将无法连接到 第一步页面成功。我上面提到的文字翻译成下面的代码。
const registerFormunuGoster = (req, res) => { res.render("register", { layout: "./layout/auth_layout" ,}) }
假设我写了上面提到的代码并打开了页面,之后我在我的页面上填写了表格,当我在填写表格后按下提交按钮时,我得到了同样的错误。为了解决这个问题,在auth_controller.js文件下如果我删除代码“req.flash(“validation_error“,错误)”在名为“register”的函数中这次我得到一个不同的error.I 我留下了下面的另一个错误。我想我得到这样一个错误的原因一定是因为我做了 res.redirect().
错误[ERR_HTTP_HEADERS_SENT]:发送给客户端后无法设置headers
我在第 4 项中提到的事件被翻译成下面的代码。
`const 寄存器 = (req, res) => { const hatalar = validationResult(req);
if (!hatalar.isEmpty()) { res.redirect("/register") } res.render("register", { layout: "./layout/auth_layout" ,})
}`
下面是我的app.js和auth_controller.js配置
app.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,
}
非常感谢大家的帮助!!! 我希望我解释清楚我收到的错误
我认为您的问题是由于误解了您应该如何发回请求。
您遇到的第二个错误 'Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client' 表明您再次尝试操作的请求已经完成(您可以在此处阅读更好的解释:Error: Can't set headers after they are sent to the client)
所以在你的情况下,你不能在同一个请求中执行 .redirect
和 .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