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
相关产品推荐
相关产品推荐

