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

Botpress技术求助:如何将数据库查询结果展示到聊天窗口?

实现Botpress聊天机器人查询Oracle数据库回复用户

嘿,作为Botpress新手想对接数据库实现智能回复,这个需求非常实用!先帮你把未完成的dbconnect.js代码补全,再一步步拆解怎么在Botpress里集成这个功能。

1. 补全数据库连接与查询代码

你的dbconnect.js已经搭好了Promise的基础框架,我帮你补全完整的连接、查询、资源释放逻辑,避免数据库连接泄漏的问题:

var oracledb = require('oracledb');
var dbConfig = require('./dbconfig.js');

// 开启自动提交,简化写入类操作的流程
oracledb.autoCommit = true;

var db = function dbCall(sql, values) {
  return new Promise(function(resolve, reject){
    oracledb.getConnection(
      { 
        user: dbConfig.user, 
        password: dbConfig.password, 
        connectString: dbConfig.connectString 
      },
      function(err, connection) {
        if (err) {
          console.error("数据库连接失败:", err);
          return reject(err);
        }

        // 执行SQL,配置返回对象格式更易处理
        connection.execute(sql, values, { outFormat: oracledb.OUT_FORMAT_OBJECT }, function(err, result) {
          // 无论成功失败,都要释放连接避免资源耗尽
          connection.release(function(releaseErr) {
            if (releaseErr) console.error("连接释放失败:", releaseErr);
          });

          if (err) {
            console.error("SQL执行失败:", err);
            return reject(err);
          }

          // 返回查询到的行数据
          resolve(result.rows);
        });
      }
    );
  });
};

// 导出函数供Botpress模块调用
module.exports = db;

这里做了几个关键优化:

  • 强制连接释放逻辑:不管查询成功或失败,都会释放数据库连接,避免连接池被占满
  • 配置outFormat: oracledb.OUT_FORMAT_OBJECT:返回结果是对象格式(比如{ id: 1, name: "张三" }),比数组更易处理
  • 增加错误日志:方便你调试排查问题
  • 导出db函数:让Botpress的自定义动作可以直接调用

2. 在Botpress中集成数据库查询功能

Botpress里推荐用**自定义动作(Custom Action)**来处理数据库查询,因为动作支持异步逻辑,还能无缝嵌入对话流程:

步骤1:创建自定义动作

在Botpress后台的「Actions」页面,点击「Create Action」,命名为fetchDatabaseData,然后在代码编辑器中写入:

// 注意:路径要根据你的文件实际位置调整,建议把dbconnect.js放在custom目录下
const db = require('../custom/dbconnect.js');

module.exports = async () => {
  // 获取用户的提问内容
  const userInput = event.payload.text;

  // 示例:根据用户问题构造参数化SQL(一定要用参数化,防止SQL注入!)
  // 比如用户问"ID为100的用户信息",可以解析出ID后传入
  const sql = "SELECT id, name, email FROM users WHERE id = :userId";
  const queryParams = [100]; // 这里可以替换为从用户输入中提取的参数

  try {
    // 调用数据库查询函数
    const queryResult = await db(sql, queryParams);
    // 将结果存入对话状态,供后续回复使用
    state.databaseResult = queryResult;
    return { completed: true };
  } catch (error) {
    console.error("数据库查询出错:", error);
    state.databaseResult = null;
    return { completed: true };
  }
};

步骤2:在对话流程中调用动作

在Botpress的「Flows」页面,拖拽一个「Action」节点到流程里,选择你刚创建的fetchDatabaseData动作,把它放在用户提问后的节点位置。

步骤3:根据查询结果回复用户

添加一个「Text」节点,用Botpress的模板语法展示查询结果:

{{#if state.databaseResult.length > 0}}
找到相关信息啦:
{{#each state.databaseResult}}
用户ID:{{id}}
姓名:{{name}}
邮箱:{{email}}
{{/each}}
{{else}}
抱歉,没有找到匹配的信息哦😥
{{/if}}

3. 新手必看注意事项

  • 严防SQL注入:绝对不要直接把用户输入拼接到SQL语句里,一定要用参数化查询(就像代码里的:userId占位符)
  • 连接池优化:如果机器人访问量较大,建议配置Oracle连接池,代替每次查询新建连接,能大幅提升性能
  • 错误兜底:在动作里一定要捕获数据库错误,避免机器人崩溃,同时给用户友好的提示
  • 路径检查:确保dbconnect.js和dbconfig.js的路径在Botpress动作中能正确访问,建议统一放在项目的custom目录下

内容的提问来源于stack exchange,提问作者Bab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:56:28