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

Node.js中Firebird JPEG Blob字段返回[Function (anonymous)]的解决方法

解决node-firebird读取Blob时的"Invalid BLOB handle"错误

问题背景

站内同类方案不适用于字节数不固定的图片读取场景,当前使用Node.js + Express + node-firebird读取产品图片Blob时,无图返回null,有图返回匿名函数,但调用转换函数时触发"Invalid BLOB handle"错误。

原代码问题分析

  1. 连接生命周期错误:原路由中conn.detach()在返回响应后立即执行,此时Blob的异步读取尚未开始,连接断开导致Blob句柄失效。
  2. 异步函数处理不当:readBlob是异步操作,内部的return无法将结果传递给调用者,导致无法获取转换后的base64值。

解决方案

1. 封装异步Blob读取函数

将readBlob改为Promise风格,支持异步等待结果:

function readBlob(blob) {
  if (!blob) return Promise.resolve(null);
  
  return new Promise((resolve, reject) => {
    blob(function (err, name, stream) {
      if (err) return reject(err);
      
      const buffers = [];
      stream.on('data', chunk => buffers.push(chunk));
      stream.on('end', () => {
        const buffer = Buffer.concat(buffers);
        resolve(buffer.toString('base64'));
      });
      stream.on('error', reject);
    });
  });
}

2. 调整路由逻辑,确保连接在Blob读取完成后断开

使用async/await梳理异步流程,用try/catch/finally保证连接资源释放:

router.get('/foto', async function (req, res) {
  const fdb = req.session.subdomain;
  const product = req.query.product;

  let conn;
  try {
    // 建立数据库连接
    conn = await new Promise((resolve, reject) => {
      firebird.attach(conn(fdb), (err, connection) => {
        err ? reject(err) : resolve(connection);
      });
    });

    // 查询产品图片Blob
    const result = await new Promise((resolve, reject) => {
      conn.query('SELECT photo FROM product WHERE product = ?', [product], (err, data) => {
        err ? reject(err) : resolve(data);
      });
    });

    // 读取Blob并转换为base64
    const base64Photo = await readBlob(result[0]?.PHOTO);
    res.json(base64Photo);
  } catch (err) {
    res.status(500).send(err.message);
  } finally {
    // 确保连接最终断开,避免资源泄漏
    if (conn) conn.detach();
  }
});

关键说明

  • 必须等待Blob读取完成后再执行conn.detach(),否则会导致Blob句柄失效。
  • 用Promise封装异步操作后,通过async/await可以更直观地处理异步流程,避免回调地狱。
  • finally块保证无论请求成功或失败,数据库连接都会被正确释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:04:59