Node.js新增表单校验后EJS模板偶现scantarget未定义报错
问题根因
输入校验失败进入else分支时,你调用res.render渲染scan_targets/new页面仅传递了errorMessage参数,没有传递模板所需的scantarget变量。而你的_form_fields.ejs模板中明确引用了scantarget.host读取表单默认值,变量未定义直接触发了该ReferenceError。
合法输入场景下要么走重定向逻辑,要么走保存失败的catch分支,catch分支里你已经传递了scantarget变量,所以不会触发报错。
修复方案
修改else分支下的render参数,补上scantarget变量的传递即可:
router.post('/', async (req, res) => { const scantarget = new scanTarget({ host: req.body.host }) //input validation. valid input has undefined error const { error, value } = schema.validate({ host_or_ip: scantarget.host }); if ( error === undefined ) { try { const newscanTarget = await scantarget.save() res.redirect('scan_targets') } catch { res.render('scan_targets/new', { scantarget: scantarget, errorMessage: 'error adding scan target' }) } }else{ res.render('scan_targets/new', { scantarget: scantarget, // 新增该行传递scantarget变量 errorMessage: 'invalid input type' }) console.log('invalid input') } })
修改后不仅可以解决报错,还能在用户输入非法内容时保留之前填写的host值,无需用户重新输入。如果你不需要保留原有输入,也可以传递空对象scantarget: {},只要保证模板能读取到该变量即可。
内容的提问来源于stack exchange,提问作者PrtSc_Alt_Ctrl_PgUp
相关产品推荐
相关产品推荐

