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

Node.js中用Mongoose检查Asset存在性并创建时遇问题求助

问题分析与修正

你的assetExists和addAsset函数存在几个关键问题,导致功能失效,下面逐一分析并给出修正方案:

1. assetExists函数的问题

  • 标记了async但混用回调函数,逻辑冗余;且当查询不到Asset时,asset为null,此时访问asset.name会直接抛出TypeError,导致代码崩溃。
  • 未处理assetName为空的场景,会导致调用方一直等待回调。

修正后的assetExists(推荐Promise/async-await风格)

async function assetExists(assetName) {
  if (!assetName) {
    throw new Error('assetName 不能为空');
  }
  // 查询指定名称的Asset,存在则返回true,否则false
  const asset = await Asset.findOne({ name: assetName });
  return !!asset;
}

如果坚持使用回调风格:

function assetExists(assetName, callback) {
  if (!assetName) {
    return callback(new Error('assetName 不能为空'), null);
  }
  Asset.findOne({ name: assetName }, (err, asset) => {
    if (err) {
      console.log(`查询Asset ${assetName} 出错:`, err);
      return callback(err, null);
    }
    // 用!!asset转换为布尔值,避免null访问错误
    callback(null, !!asset);
  });
}

2. addAsset函数的问题

  • async与回调混用:newAsset.save()传入回调时不会返回Promise,await完全无效,无法等待保存完成。
  • 保存成功时未调用callback返回结果,调用方无法感知创建状态。
  • 未处理assetName为空的场景。

修正后的addAsset(推荐Promise/async-await风格)

async function addAsset(assetName) {
  if (!assetName) {
    throw new Error('assetName 不能为空');
  }
  const newAsset = new Asset({ name: assetName });
  // 返回保存后的Asset实例
  return await newAsset.save();
}

如果坚持使用回调风格:

function addAsset(assetName, callback) {
  if (!assetName) {
    return callback(new Error('assetName 不能为空'), null);
  }
  const newAsset = new Asset({ name: assetName });
  newAsset.save((err, asset) => {
    if (err) {
      console.log(`创建Asset ${assetName} 出错:`, err);
      return callback(err, null);
    }
    // 成功时返回创建的Asset实例
    callback(null, asset);
  });
}

3. 完整功能调用示例

结合两个函数实现「检查不存在则创建」的逻辑:

async function checkAndCreateAsset(assetName) {
  try {
    const exists = await assetExists(assetName);
    if (exists) {
      console.log(`Asset ${assetName} 已存在`);
      return;
    }
    const createdAsset = await addAsset(assetName);
    console.log(`Asset ${assetName} 创建成功`, createdAsset);
  } catch (err) {
    console.error('处理Asset时出错:', err);
  }
}

// 调用示例
checkAndCreateAsset('测试资产');

额外注意事项

你的数据库连接字符串未指定具体数据库名称,建议补充,否则默认连接到test数据库:

// 修改连接字符串,添加数据库名(替换为你的业务数据库名)
mongoose.connect('mongodb+srv://<username>:<password>@<clustername>.4ny68c7.mongodb.net/你的数据库名?retryWrites=true&w=majority');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:52:40