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

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,从数据库层面避免重复插入,同时提升查询效率。

验证步骤

  1. 确认MongoDB服务正常运行,mongoose连接配置无误。
  2. 启动服务后调用isSetSearchDomain方法传入域名数组,检查数据库domain集合的_id是否按1、2、3...依次自增。
  3. 查看控制台日志,确认保存成功的文档对象中包含正确的自增_id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:48