You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:45:03