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

使用Couchbase Ottoman创建实例时抛出TypeError错误求助

解决Ottoman中TypeError: User is not a constructor错误

问题原因

你的代码存在两个核心问题:

  1. 数据库连接与启动是异步操作,但你同步执行了模型创建、实例化及保存逻辑,导致Ottoman未完成初始化时,User模型还未被正确注册为可构造对象。
  2. 在全局作用域直接创建模型实例,未等待Ottoman完成启动流程,此时模型构造函数尚未就绪。

修正后的代码

将所有依赖数据库初始化的逻辑纳入异步流程,确保Ottoman连接并启动完成后再执行后续操作:

const ottoman = require("ottoman");

async function connect() {
  try {
    await ottoman.connect({
      connectionString: process.env.DB_CONNECTION_STRING,
      bucketName: process.env.DB_BUCKET,
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
    });
    console.log("Database connected.");
    await ottoman.start();
    return true;
  } catch (error) {
    console.log("Database not connected due to: ", error.message);
    return false;
  }
};

async function main() {
  // 等待数据库连接完成
  const isConnected = await connect();
  if (!isConnected) return;

  // 连接完成后再创建模型
  const User = ottoman.model("User", {
    firstName: String,
    lastName: String,
    email: String,
    tagline: String,
  });

  // 创建实例并保存(注意修正字段名:模型定义为tagline,原代码写的是tagLine)
  const perry = new User({
    firstName: "Perry",
    lastName: "Mason",
    email: "perry.mason@example.com",
    tagline: "Who can we get on the case?",
  });

  const tom = new User({
    firstName: "Major",
    lastName: "Tom",
    email: "major.tom@example.com",
    tagline: "Send me up a drink",
  });

  await perry.save();
  console.log(`success: user ${perry.firstName} added!`);

  await tom.save();
  console.log(`success: user ${tom.firstName} added!`);
};

// 执行主逻辑
main();

额外注意点

  • 修正了实例中的字段名:模型定义的是tagline,原代码误写为tagLine,这会导致字段无法正确存入数据库。
  • 避免在全局作用域直接调用异步的connect函数,将其纳入主异步流程,确保所有依赖数据库的操作都在连接完成后执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:45:32