NodeJS+Express+MongoDB使用mongoose-sequence自增_id请求无响应问题
问题分析与解决方案
你的代码主要问题在于多余的Promise嵌套以及错误的手动调用setNext方法,导致请求被阻塞无法正常返回。以下是分步修正方案:
1. 修正模型文件(domain.model.js)
原模型代码基本可用,补充配置后可避免mongoose默认生成ObjectId类型的_id,确保自增插件正常工作:
const mongoose = require("mongoose"); const AutoIncrement = require("mongoose-sequence")(mongoose); const schema = mongoose.Schema( { _id: { type: Number, required: true // 明确字段要求,由插件自动填充值 }, domain: { type: String, required: true, trim: true, unique: true // 添加唯一索引,避免重复插入相同域名 }, }, { id: false } // 禁用mongoose默认生成的虚拟id字段 ); // 配置自增插件,指定自增字段为_id,起始值设为1 schema.plugin(AutoIncrement, { inc_field: "_id", start_seq: 1 }); const Domain = mongoose.model("domain", schema); module.exports = Domain;
2. 重构业务函数(isSetSearchDomain)
原函数存在不必要的Promise嵌套、错误的setNext调用(该方法无需手动执行,插件会在save时自动处理),以及错误处理不完整的问题,重构后代码如下:
const isSetSearchDomain = async (dom) => { try { // 并行处理每个域名 const results = await Promise.all(dom.map(async (domain) => { // 查询当前域名是否已存在 const existingDomain = await Domain.findOne({ domain }); if (existingDomain) { return { _id: existingDomain._id, domain: existingDomain.domain }; } // 创建新文档,无需手动指定_id,插件会自动赋值 const newDomain = new Domain({ domain }); // 保存文档,插件自动填充自增_id const savedDomain = await newDomain.save(); console.log("文档保存成功:", savedDomain); return { _id: savedDomain._id, domain: savedDomain.domain }; })); return results; } catch (error) { console.error("处理失败:", error); log.error(error); return false; } };
关键修正点说明
- 移除多余Promise嵌套:async函数本身返回Promise,无需手动包裹new Promise,避免因resolve时机错误导致请求阻塞。
- 删除手动
setNext调用:mongoose-sequence插件会在save()执行时自动为_id生成自增值,手动调用会引发逻辑冲突,甚至阻塞进程。 - 完善错误处理:将save操作的错误抛出到外层catch统一处理,避免错误被静默忽略导致请求无响应。
- 添加唯一索引:在domain字段设置
unique: true,从数据库层面避免重复插入,同时提升查询效率。
验证步骤
- 确认MongoDB服务正常运行,mongoose连接配置无误。
- 启动服务后调用
isSetSearchDomain方法传入域名数组,检查数据库domain集合的_id是否按1、2、3...依次自增。 - 查看控制台日志,确认保存成功的文档对象中包含正确的自增
_id。
内容的提问来源于stack exchange,提问作者Gulliver
相关产品推荐
相关产品推荐

