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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:57