node.js - 发送后无法设置标头 NodeJS Express
问题描述
我是 NodeJS 的新手,当我尝试使用电子邮件和密码登录时,出现以下错误:(部分原因)
错误:发送后无法设置标头。在 validateHeader (_http_outgoing.js:491:11) 在 ServerResponse.setHeader (_http_outgoing.js:498:3) 在 ServerResponse.header (C:\Users\asuss\Desktop\server\node_modules\express\lib\response.js: 771:10) 在 ServerResponse.location (C:\Users\asuss\Desktop\server\node_modules\express\lib\response.js:888:15) 在 ServerResponse.redirect (C:\Users\asuss\Desktop\server\ node_modules\express\lib\response.js:926:18) at app.post (C:\Users\asuss\Desktop\server\app.js:114:9) at Layer.handle [as handle_request] (C:\ Users\asuss\Desktop\server\node_modules\express\lib\router\layer.js:95:5) 在下一个 (C:\Users\asuss\Desktop\server\node_modules\express\lib\router\route.js: 137:13)
在 redirectHome (C:\Users\asuss\Desktop\server\app.js:42:9) 在 Layer.handle [as handle_request] (C:\Users\asuss\Desktop\server\node_modules\express\lib\router\ layer.js:95:5) 错误:发送后无法设置标题。在 validateHeader (_http_outgoing.js:491:11) 在 ServerResponse.setHeader (_http_outgoing.js:498:3) 在 ServerResponse.header (C:\Users\asuss\Desktop\server\node_modules\express\lib\response.js: 771:10) 在 ServerResponse.location (C:\Users\asuss\Desktop\server\node_modules\express\lib\response.js:888:15)
const express = require('express')
const session = require('express-session')
const bodyParser = require('body-parser')
const users = [
{id: 1, name: 'Alex', email:'alex@gmail.com', password:"123"},
{id: 2, name: 'Max', email:'max@gmail.com', password:"123"},
{id: 3, name: 'Tiffany', email:'tiffany@gmail.com', password:"123"}
]
const app = express()
app.use(bodyParser.urlencoded({
extended: true
}))
app.use(session({
name: 'sid',
resave: false,
saveUninitialized: false,
secret: "nikivekartal",
cookie: {
maxAge: 1000*60*60*2,
sameSite: true,
}
}))
const redirectLogin = (req, res, next) => {
if(!req.session.userId){
res.redirect('/login')
}
else {
next()
}
}
const redirectHome = (req, res, next) => {
if(req.session.userId){
res.redirect('/home')
}
else {
next()
}
}
app.get('/', (req, res) => {
const {userId} = req.session;
console.log("Session", req.session.userId)
res.send(`
<h1>Welcome!</h1>
${userId ? `
<a href='/home'>Home</a>
<form method='post' action='/logout'>
<button>Logout</button>
</form>
` : `
<a href='/login'>Login</a>
<a href='/register'>Register</a>
`}`)
})
app.get('/home', redirectLogin, (req, res) => {
res.send(`
<h1>Home</h1>
<a href='/'>Main</a>
<ul>
<li>Apple</li>
<li>Cherry</li>
</ul>
`)
})
// redirectHome mddleware ini eğer user authenticate olmuşsa login'e gitmesin
// home'a gitsin diye koyuyoruz
app.get('/login', redirectHome, (req, res) => {
res.send(`
<h1>Login</h1>
<form method='post' action='/login'>
<input type='email' name='email' placeholder='Email' required/>
<input type='password' name='password' placeholder='Password' required/>
<input type='submit' />
</form>
<a href='/register'>Register</a>
`)
})
app.get('/register', redirectHome, (req, res) => {
res.send(`
<h1>Register</h1>
<form method='post' action='/register'>
<input name='name' placeholder='Name' required />
<input type='email' name='email' placeholder='Email' required/>
<input type='password' name='password' placeholder='Password' required/>
<input type='submit' />
</form>
`)
})
app.post('/login', redirectHome, (req, res) => {
const {email, password} = req.body
if(email && password){
const user = users.find(
user => user.email === email && user.password === password
)
if(user){
req.session.userId = user.id
res.redirect('/home')
}
}
res.redirect('/login')
})
app.post('/register', redirectHome, (req, res) => {
})
app.post('/logout', redirectLogin, (req, res) => {
})
app.listen(process.env.PORT || 3000, () => {
console.log("Server is running");
})
我应该怎么做,为什么?谢谢您的考虑。
解决方案
您的/login
路线可以调用res.redirect()
两次。在其中一个之后添加一个 return 来改变这个:
app.post('/login', redirectHome, (req, res) => {
const {email, password} = req.body
if(email && password){
const user = users.find(
user => user.email === email && user.password === password
)
if(user){
req.session.userId = user.id
res.redirect('/home')
}
}
res.redirect('/login')
});
对此:
app.post('/login', redirectHome, (req, res) => {
const {email, password} = req.body
if(email && password){
const user = users.find(
user => user.email === email && user.password === password
)
if(user){
req.session.userId = user.id
res.redirect('/home')
return; // <== add this return
}
}
res.redirect('/login')
});
推荐阅读
- python - 使用 Numpy Array 遍历 .txt 文件中的时间序列数据
- maven - 运行 wildfly:run 目标后,有没有办法使用 maven build 进行处理?
- php - Polylang 翻译网址 slug 无法正常工作
- python - 如何将嵌套字典列表转换为 pandas 数据框?
- python - 如何在熊猫中滚动非重叠窗口
- c# - 避免对具有可为空类型/字段的泛型发出警告的最佳方法?
- c++ - 循环内的局部对象的析构函数是否保证在下一次迭代之前被调用?
- amazon-web-services - EKS / AWS 中的 Hazelcast 主节点选举是可能的吗?
- javascript - createObjectURL blob url 在 Chrome 中不安全
- r - 在 Jupyter Notebook 中无法访问 Anaconda 上的安装包