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

JavaScript函数始终返回undefined:从数据库获取图片名失败排查

问题:数据库查询函数返回undefined,回调内却能正常输出结果

尝试从数据库获取图片名称,但调用returnOldFileName函数后始终返回undefined,回调函数内的console.log却能正常输出图片名。相关代码如下:

const returnOldFileName = (id) => {
  let imageName;
  const getQuery = `SELECT image from products WHERE id=${id}`;
  db.query(getQuery, (err, result) => {
    console.log(result.rows[0].image);  // 此处能正常输出结果
    if (result) return result.rows[0].image;
  });
};

const image=returnOldFileName(2)
console.log(image) // 输出undefined

原因分析

db.query是异步操作,returnOldFileName函数会在异步回调执行前就完成执行,所以默认返回undefined。回调函数里的return只是回调自身的返回值,并不会传递给外层的returnOldFileName函数。


解决方法

方法1:用Promise封装 + async/await调用

将异步操作封装成Promise,调用时用async/await等待结果返回:

const returnOldFileName = (id) => {
  return new Promise((resolve, reject) => {
    // 改用参数化查询避免SQL注入
    const getQuery = `SELECT image from products WHERE id=$1`;
    db.query(getQuery, [id], (err, result) => {
      if (err) reject(err);
      resolve(result?.rows[0]?.image);
    });
  });
};

// 需在async函数内调用
(async () => {
  try {
    const image = await returnOldFileName(2);
    console.log(image);
  } catch (err) {
    console.error('查询出错:', err);
  }
})();

方法2:传入回调函数

直接给returnOldFileName传入回调,在异步操作完成后执行回调:

const returnOldFileName = (id, callback) => {
  // 改用参数化查询避免SQL注入
  const getQuery = `SELECT image from products WHERE id=$1`;
  db.query(getQuery, [id], (err, result) => {
    if (err) return callback(err);
    callback(null, result?.rows[0]?.image);
  });
};

// 调用时传入回调处理结果
returnOldFileName(2, (err, image) => {
  if (err) {
    console.error('查询出错:', err);
    return;
  }
  console.log(image);
});

额外提醒

不要直接将id拼接进SQL语句,这种写法存在SQL注入风险,上面的示例已经改用参数化查询($1和参数数组[id]),这是更安全的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:50:22