Node Express重新提交表单时抛出错误
我是新来表达。我正在编写演示身份验证。
但显示此错误
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
当重新提交表单时。如果我使用请求记录器,则它表明我收到一个发布请求。但是form.parse上的回调函数被调用了两次。我只是不知道为什么会这样。
router.post('/signup', (req,res)=>{
form.parse(req, (err, fld)=>{
if(err) throw err;
let name = fld.name;
let pass = fld.password;
let checkUser = users.filter(item=>{ item.name == name })
if(checkUser.length >0){
res.render('form.html', {err: 'Username Exists!'});
console.log('**') // this line prints twice when a from is resubmitted
}else{
let user = new User(name, pass);
users.push(user);
save(users, './user.json', ()=>{
res.end('you can log in now');
});
}
})
})
我正在使用ejs作为视图引擎。users是用户对象的数组。save是写入json文件的函数。他们工作得很好。
回答如下:我想我得到了答案。问题在于创建了强大的对象。我做错的是我在脚本的开头创建了表单对象。这使表单对象成为全局对象并引起了麻烦。
let form = new formidale.IncomingForm()
我必须分别为每个发布请求创建新的表单表单对象,也就是说,我必须将此行放入路由中。
router.post('/signup', (req,res)=>{
let form = new formidable.IncomingForm(); // this is where it should belong
form.parse(req, (err, fld)=>{
if(err) throw err;
let name = fld.name;
let pass = fld.password;
let checkUser = users.filter(item=>{
return item.name == name
})
if(checkUser.length >0){
res.render('form.html', {'err': 'Username Exists!'});
console.log('2');
return
}else{
console.log(3);
let user = new User(name, pass);
users.push(user);
save(users, './user.json', ()=>{
res.end('you can log in now');
});
}
})
})
现在可以正常工作了。
我希望这个问题的答案能在某个时候帮助某个人。 :)