
在使用node.js和handlebars构建动态web应用时,开发者常遇到一个需求:将用户在前端输入框中填写的值传递到后端进行处理(例如,查询数据库)。一种常见的尝试是利用<a>标签结合handlebars模板语法,将输入值作为url路径的一部分:
<label for="cedula">Cedula donante:</label>
<input type="number" name="cedula" id="cedula" value="" placeholder="Cedula donante" autofocus>
<a href="/donaciones/buscar/{{cedula}}" class="btn btn-primary">Buscar</a>以及对应的后端Express路由:
router.get('/buscar/:cedula', isLoggedIn ,async(req, res) =>{
const { cedula } = req.params;
// ... 数据库查询逻辑
});然而,这种方法通常会导致“Cannot GET /donaciones/buscar/”之类的错误。这是因为{{cedula}}在Handlebars模板渲染时,如果cedula变量在当前上下文中没有被定义或为空,它会被渲染为空字符串。一旦页面加载完成,<a>标签的href属性就固定了,它不会动态地捕获用户在<input>框中实时输入的值。因此,无论用户在输入框中输入什么,点击链接时,浏览器实际发送的请求是/donaciones/buscar/,导致后端无法匹配带有参数的路由。
尽管直接在浏览器地址栏输入localhost:3000/donaciones/buscar/4----可以正常工作,但这只是因为URL中的值是硬编码的,而非通过前端输入框动态获取并传递。这进一步证明了问题在于前端动态值的传递机制。
将用户输入从前端传递到后端的标准且推荐方式是使用HTML的<form>元素。表单专门设计用于收集用户输入并将这些数据发送到服务器。
立即学习“前端免费学习笔记(深入)”;
将输入框和“Buscar”按钮包裹在一个<form>标签中,并指定action(数据提交的目标URL)和method(HTTP方法,通常为POST用于提交数据)。
<form action="/donaciones/ingresos" method="POST">
<div class="form-group">
<label for="cedula">Cedula donante:</label>
<input type="number" name="cedula" id="cedula" value="" placeholder="Cedula donante" autofocus>
<button type="submit" class="btn btn-primary">Buscar</button>
</div>
</form>关键点解析:
由于前端现在使用POST方法提交数据,后端路由也需要相应地从GET改为POST,并且通过req.body来获取提交的数据。请确保你的Express应用已经配置了中间件来解析请求体,例如express.urlencoded()。
// 在你的Express应用配置中(例如app.js或index.js),确保已启用请求体解析:
// app.use(express.urlencoded({ extended: true })); // 用于解析 application/x-www-form-urlencoded
// app.use(express.json()); // 如果也处理 JSON 请求体
// 适配后的后端路由
router.post('/donaciones/ingresos', isLoggedIn ,async(req, res) =>{
// 从请求体(req.body)中获取 'cedula' 值
// 注意:这里的 'cedula' 对应前端 input 元素的 name 属性
const { cedula } = req.body;
// 后续数据库查询逻辑保持不变
const donante = await pool.query('SELECT * FROM donantes WHERE cedula = ?', [cedula]);
if (donante.length < 1) {
req.flash('message', 'Donante no registrado!');
res.redirect('/donantes/ingreso_donantes');
}else {
res.render('donaciones/donaciones_ingreso', { donante : donante[0] });
}
});现在,当用户在前端输入cedula并点击“Buscar”按钮时,该值会作为POST请求的一部分被发送到/donaciones/ingresos路由,后端便可以通过req.body.cedula正确获取并处理。
在Node.js与Handlebars结合的应用中,将前端用户输入传递到后端的核心原则是:对于动态的用户输入数据,应始终使用HTML <form> 元素配合适当的 HTTP 方法(通常是 POST)进行提交。避免误用<a>标签来传递动态输入值,因为它仅在页面渲染时处理模板变量,无法捕获实时的用户输入。通过遵循这一模式,并结合后端请求体解析、输入验证和错误处理,可以确保前端与后端之间的数据流是可靠、高效且符合Web标准的。
以上就是Node.js与Handlebars:前端输入值到后端传递的正确姿势的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号