Sails JS视图中调用sails.sendNativeQuery()失败的求助
解决Sails.js客户端无法调用
sails.sendNativeQuery()更新数据库的问题 你遇到的问题很典型——浏览器端的JavaScript运行在完全独立的环境里,根本访问不到后端的sails对象,所以直接调用sails.sendNativeQuery()肯定会报错。正确的做法是通过前后端API交互来完成数据更新,具体步骤如下:
1. 后端新增数据更新接口
首先在api/controllers/entrance/目录下创建一个处理更新的控制器,比如update-vertrag.js,用来接收前端的更新请求并操作数据库:
module.exports = { async fn(req, res) { try { const { tk, ...updatedFields } = req.body; // 方式一:使用模型的update方法(推荐,符合Sails的ORM规范) const updatedCrm = await Crm.updateOne({ vertrag: tk }).set(updatedFields); // 如果你确实需要用sendNativeQuery,也可以这么写: // const query = `UPDATE crm SET ${Object.keys(updatedFields).map(key => `${key} = ?`).join(', ')} WHERE vertrag = ?`; // const values = [...Object.values(updatedFields), tk]; // await sails.sendNativeQuery(query, values); if (!updatedCrm) { return res.notFound('未找到对应的数据记录'); } return res.ok({ message: '数据更新成功', data: updatedCrm }); } catch (err) { sails.log.error('更新数据失败:', err); return res.serverError('服务器内部错误'); } } };
然后在config/routes.js里配置对应的路由:
'PUT /entrance/update-vertrag': 'entrance/update-vertrag.fn'
2. 前端通过AJAX发送更新请求
在vertrag.ejs的script标签里,给保存按钮添加点击事件,收集修改后的表单数据,然后通过Fetch API发送请求到刚才的后端接口:
<!-- 示例表单结构 --> <div class="property-item"> <input type="text" id="customerName" value="<%= dcrm.customerName %>"> <button class="save-btn" data-tk="<%= dcrm.vertrag %>">保存</button> </div> <script> // 等待DOM加载完成后绑定事件 document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.save-btn').forEach(btn => { btn.addEventListener('click', async function() { const tk = this.dataset.tk; // 收集当前修改的属性值(根据你的实际表单结构调整) const updatedData = { customerName: document.getElementById('customerName').value, // 添加更多需要修改的字段 }; try { const response = await fetch('/entrance/update-vertrag', { method: 'PUT', headers: { 'Content-Type': 'application/json', // Sails默认开启CSRF防护,需要带上token 'X-CSRF-Token': '<%= _csrf %>' }, body: JSON.stringify({ tk, ...updatedData }) }); const result = await response.json(); if (response.ok) { alert(result.message); // 可选:更新页面显示的数据,无需刷新 } else { alert('更新失败:' + result.message); } } catch (err) { console.error('请求出错:', err); alert('网络请求失败,请稍后重试'); } }); }); }); </script>
额外注意事项
- 数据验证:后端一定要对前端传过来的数据做验证,避免恶意数据或者非法格式,比如用Sails的
req.validate()方法。 - CSRF防护:如果你的Sails项目开启了CSRF(默认是开启的),记得在请求头里带上
X-CSRF-Token,可以通过EJS的<%= _csrf %>获取。 - 错误处理:前端和后端都要做好错误捕获和提示,提升用户体验。
内容的提问来源于stack exchange,提问作者Kandre
相关产品推荐
相关产品推荐

