javascript - TypeError: req.flash is not a function -- (NodeJs) (connect-flash) -- 我无法打开页面
问题描述
当我尝试从页面登录时,出现错误
类型错误:req.flash 不是函数
我解释了我得到的错误和我尝试过的方法
如果我删除
console.log (req.flash ("validation_error"))
auth_controller 文件中名为“registerFormunuGoster”的函数中的这段代码,我可以在第一步中成功链接到页面。如果我不删除此代码,我无法在第一步中成功连接到页面。我上面提到的文字被翻译成下面的代码。
const registerFormunuGoster = (req, res) => { res.render("register", { layout: "./layout/auth_layout" ,}) }
假设我编写了上面提到的代码并打开了页面,然后我在页面上填写了表单,并且每当我在填写表单后按下提交按钮时都会收到相同的错误。为了解决这个问题,在 auth_controller.js 文件下如果我在名为“register”的函数中删除代码“req.flash (“validation_error”,errors)”,这次我会得到一个不同的错误。我留下另一个错误我到下面。我想我得到这样一个错误的原因一定是因为我做了 res.redirect()。
错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
我在第 4 项中提到的事件被翻译成下面的代码。
`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,
}
我真的很感谢大家的帮助!!! 我希望我能很好地解释我收到的错误
解决方案
我认为您的问题来自对如何将请求发回的误解。
您遇到的第二个错误“错误 [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
推荐阅读
- class - 如何将自定义 CSS 类添加到
- AEM RTE 组件
- python - Blender 作为 Python 模块 Mac
- python - 实现可迭代的 jsonpickle 解码两次
- java - 我不确定为什么我的程序不断崩溃
- wordpress - 如何将一个站点页面数据获取到 WordPress 多站点中的另一个站点页面
- sql-server - SQL Server 复制数据库向导 -w/o- 登录提示错误 (SMO) 用户、组或角色“x”已存在于当前数据库中
- c++ - 将 boost 函数与 boost 绑定与地图一起使用
- javascript - 如果所选选项的值动态更改,则选择标签值不会更新
- c# - 无法加载文件或程序集或其依赖项之一,错误消息正在更改
- apache-pulsar - 错误没有这样的文件或目录:_pulsar.so