新闻详情

新闻详情

首页 / 资讯中心 / 详情

Model.create() no longer accepts a callback 的解决方法:TaoToken 统一 Key 接入 Mongoose 迁移实战

发布时间:2026/10/2 16:38:29来源:尧图网络
Model.create() no longer accepts a callback 的解决方法:TaoToken 统一 Key 接入 Mongoose 迁移实战
1. 从一次 Mongoose 升级报错说起Model.create() no longer accepts a callback 到底在说什么如果你最近把项目里的 mongoose 从 6.x 升到 7.x或者直接npm i mongoose装了最新版然后跑起以前能用的代码很可能在控制台看到这么一行Model.create() no longer accepts a callback第一次看到这个报错很多人会以为是数据库没连上或者 mongod 版本不对。我当初也这么想过甚至去降级 mongod结果发现根本不是数据库的问题。真正的原因在 mongoose 自己身上从 7.0 开始mongoose 全面移除了回调风格的 APIModel.create()、Model.find()、Model.updateOne()这些方法都不再接受最后一个 callback 参数只返回 Promise。换句话说你以前这样写是合法的BookModel.create({ name: 西游记 }, (err, data) { if (err) return console.log(err); console.log(data); });到了 mongoose 7这段代码会直接抛错因为create()检测到你传了函数作为最后一个参数而它已经不支持了。它期望你改用async/await或者.then()。这个改动影响面其实挺大的。很多老教程、老项目、甚至一些脚手架生成的代码都还在用回调写法。尤其是做 Node.js 后端的朋友手里维护着几年前的项目一升级就炸一片。所以这篇文章不是单纯告诉你「把 callback 删掉」而是把整个迁移路径讲清楚怎么改代码、怎么配连接、怎么验证、报错怎么排查。适合谁看三类人最需要一是正在做 mongoose 6 升 7 的开发者二是刚学 Node.js跟着老教程写回调结果跑不起来的新手三是团队里负责统一技术栈、想把数据库访问层规范化的人。核心检索词就一个Model.create() no longer accepts a callback的解决方法围绕它把 mongoose 迁移这件事讲透。下面我会先讲清楚这个报错的触发条件再给出可复制的 async/await 改写方案然后带上连接参数配置最后用真实请求验证一遍。中间涉及模型调用时我会用 TaoToken 的统一 Key 来演示怎么把模型 ID、Base URL、Key 三件套配好方便你在迁移过程中顺手把 AI 能力也接进去。2. 迁移前的前置准备用 TaoToken 统一 Key 管好模型接入与 mongoose 连接参数在动手改代码之前先把环境理顺。很多人迁移失败不是改法不对而是连接层就乱了mongoose 连接串写错、模型没注册、或者项目里同时存在多个版本的 mongoose。先说 mongoose 这边。升级到 7.x 之后连接方式本身没大变但有几个参数值得注意。以前常用的useNewUrlParser、useUnifiedTopology在 6.x 就已经是默认行为7.x 里再传会警告甚至报错。所以连接代码要精简const mongoose require(mongoose); async function connectDB() { await mongoose.connect(mongodb://127.0.0.1:27017/bookstore, { serverSelectionTimeoutMS: 5000, maxPoolSize: 10, }); console.log(mongodb connected); }注意这里用的是127.0.0.1而不是localhost。在部分 Node.js 版本里localhost会优先解析成 IPv6 的::1而本地 mongod 默认只监听 IPv4结果就是连接超时。这个坑我踩过排查了半天。再说模型接入这一层。现在很多 Node.js 项目不只是连数据库还要调大模型做内容生成、摘要、分类。如果每个模型都单独配 Key、单独写 Base URL迁移的时候很容易漏。我的做法是用 TaoToken 的统一 Key 来管一个 Key 走所有模型Base URL 固定模型 ID 按需切换。这样在 mongoose 迁移期间AI 调用那部分完全不用动减少变量。TaoToken 的 API 地址是https://taotoken.net/api官网是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。你需要在控制台创建一个 API Key然后把它放进环境变量不要硬编码在代码里。具体操作路径先打开控制台页面https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite登录后进入 API Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite新建一个 Key 并复制。这个 Key 就是后面所有模型调用的凭证。为什么要在 mongoose 迁移文章里讲这个因为迁移过程中你很可能要写脚本批量处理旧数据比如把回调风格的写入改成 Promise 风格后需要跑一遍数据校验。这时候用模型帮你生成测试数据、检查字段会快很多。统一 Key 的好处是你不需要为每个模型单独申请、单独记一个 Key 配好模型 ID 换一下就行。环境变量这样配export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在代码里读取。这样无论是本地跑迁移脚本还是部署到服务器配置方式一致不会出现「本地能跑线上报 401」的情况。前置准备做到这里就够了mongoose 连接串确认、TaoToken Key 拿到、环境变量设好。接下来进入真正的代码改写。3. 可复制的配置与改写async/await 替换 callback 的完整 settings 片段这一节是核心直接给可复制的代码。先明确改写原则所有Model.create()、Model.find()、Model.findOne()、Model.updateOne()、Model.deleteOne()的最后一个 callback 参数全部删掉改成await或者.then()。先看最典型的create()。旧写法BookModel.create( { name: 西游记, author: 吴承恩, price: 20, is_hot: true }, (err, data) { if (err) { console.log(err); return; } console.log(data); } );新写法用 async/awaitasync function addBook() { try { const data await BookModel.create({ name: 西游记, author: 吴承恩, price: 20, is_hot: true, }); console.log(data); } catch (err) { console.error(create failed:, err.message); } }如果你不想用 async 函数也可以用.then()BookModel.create({ name: 西游记, author: 吴承恩, price: 20, is_hot: true, }) .then((data) console.log(data)) .catch((err) console.error(err.message));两种都行但团队里最好统一。我建议用 async/await因为错误处理更直观try/catch能覆盖多个 await。接下来是连接配置。把 mongoose 连接和模型定义放在一起方便你直接复制const mongoose require(mongoose); const bookSchema new mongoose.Schema({ name: { type: String, required: true }, author: { type: String, required: true }, price: { type: String }, is_hot: { type: Boolean, default: false }, }); const BookModel mongoose.model(Book, bookSchema); async function main() { await mongoose.connect(mongodb://127.0.0.1:27017/bookstore, { serverSelectionTimeoutMS: 5000, maxPoolSize: 10, }); const data await BookModel.create({ name: 西游记, author: 吴承恩, price: 20, is_hot: true, }); console.log(inserted:, data); await mongoose.disconnect(); } main().catch((err) console.error(err));这段代码可以直接存成migrate.js跑。注意mongoose.disconnect()也要 await否则进程可能不退出。现在把 TaoToken 的模型调用也配进来。假设你要在写入前用模型生成一段书籍简介配置片段如下。这里用 OpenAI 兼容的 SDK 风格Base URL 指向 TaoTokenconst OpenAI require(openai); const client new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: process.env.TAOTOKEN_BASE_URL, }); async function generateIntro(bookName) { const res await client.chat.completions.create({ model: claude-sonnet-4-20250514, messages: [ { role: user, content: 用一句话介绍《${bookName}》 }, ], }); return res.choices[0].message.content; }这里的三件套必须齐全Base URL 是https://taotoken.net/apiKey 是环境变量里的TAOTOKEN_API_KEYModel ID 是claude-sonnet-4-20250514。少任何一个都会报错后面排障会讲。如果你用的是 Claude Code 这类工具做代码润色配置方式类似Base URL 和 Key 一样模型 ID 换成对应的即可。文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有各模型的 ID 列表。把数据库写入和模型调用串起来就是一个完整的迁移后脚本async function migrate() { await mongoose.connect(mongodb://127.0.0.1:27017/bookstore); const intro await generateIntro(西游记); const data await BookModel.create({ name: 西游记, author: 吴承恩, price: 20, is_hot: true, intro, }); console.log(data); await mongoose.disconnect(); }这样改写之后Model.create() no longer accepts a callback就不会再出现了。核心就一句话把 callback 删掉用 await 接返回值。4. 本地运行验证从启动 mongod 到看到成功写入的完整步骤代码改完得跑一遍确认。这一节给完整的验证流程照着做就行。第一步确认 mongod 在跑。打开终端mongod --version如果显示版本号说明装了。然后启动服务mongod --dbpath /你的数据目录 --port 27017数据目录要提前建好比如mkdir -p ~/data/db。启动后看到waiting for connections on port 27017就对了。注意这里不需要降级到 6.xmongoose 7 支持 mongod 5.0 以上报错跟 mongod 版本无关。第二步确认 mongoose 版本npm list mongoose应该是 7.x 或 8.x。如果是 6.x那create()还支持 callback不会报错但建议一起升上来。第三步把上面的migrate.js存好设置环境变量export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api node migrate.js第四步看输出。成功的话会打印插入的文档包含_id、name、intro等字段。类似inserted: { name: 西游记, author: 吴承恩, price: 20, is_hot: true, intro: 《西游记》讲述唐僧师徒四人西天取经的神话故事。, _id: new ObjectId(...), __v: 0 }第五步去数据库里确认。用 mongoshmongosh use bookstore db.books.find()能看到刚插入的记录说明写入成功。第六步验证模型调用。单独跑一段const OpenAI require(openai); const client new OpenAI({ apiKey: process.env.TAOTOKEN_API_KEY, baseURL: process.env.TAOTOKEN_BASE_URL, }); client.chat.completions .create({ model: claude-sonnet-4-20250514, messages: [{ role: user, content: 回复 ok }], }) .then((r) console.log(r.choices[0].message.content)) .catch((e) console.error(e.message));如果打印出ok说明 Key、Base URL、模型 ID 三件套都对。如果你想在网页里直接试模型可以打开模型对话页https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite选好模型发一句话确认账号可用。这一步能快速区分是代码问题还是账号问题。验证顺序建议先确认 mongod 在跑再确认 mongoose 版本再跑写入脚本最后单独验证模型调用。这样出问题时能快速定位是哪一层。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth 逐个击破迁移过程中常见的报错就那么几个我按真实遇到的整理一下对照着查。报错一Model.create() no longer accepts a callback这个就是本文主题。原因mongoose 7 移除了 callback。解决删掉最后一个函数参数改用 await 或 .then()。如果你不想改代码可以临时降级到 mongoose 6.x但不推荐因为 6.x 迟早要升。报错二401 Unauthorized调模型时出现说明 Key 不对或没传。检查三件事环境变量TAOTOKEN_API_KEY是否设置、代码里是否读到了、Key 是否复制完整前后没空格。可以在代码里打印process.env.TAOTOKEN_API_KEY?.slice(0, 8)确认前几位。报错三local proxy failed或连接超时这个通常出现在 Base URL 写错或者本地网络环境有干扰。确认 Base URL 是https://taotoken.net/api不要多加/v1或漏掉/api。另外检查是否有全局的 HTTP 代理环境变量干扰比如HTTP_PROXY、HTTPS_PROXY有的话先 unset 掉再跑。报错四Cannot read properties of undefined (reading choices)这个报错说明请求返回了但结构不对。常见原因是 Base URL 少了/api请求打到了别的路径返回的不是标准结构。或者模型 ID 写错服务端返回了错误对象你直接取choices就 undefined。解决先打印完整响应console.log(JSON.stringify(res, null, 2))看清楚返回了什么。报错五OAuth 相关错误如果你用 Claude Code 或类似工具可能会遇到 OAuth 认证失败。这类工具通常支持两种认证OAuth 登录和 API Key。用 TaoToken 的话走 API Key 方式在配置里填 Base URL 和 Key不要走 OAuth 流程。具体配置参考文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。报错六MongooseError: Operation buffering timed out这个不是 callback 问题是连接没建立就执行了查询。mongoose 默认会缓冲操作但超时后会报这个。解决确保await mongoose.connect()完成后再执行create()。把连接和操作放在同一个 async 函数里按顺序 await。报错七MongoServerError: Authentication failed连接串里带了用户名密码但不对。本地开发一般不用认证连接串写成mongodb://127.0.0.1:27017/bookstore即可。如果确实需要认证格式是mongodb://user:pass127.0.0.1:27017/bookstore?authSourceadmin。排查通用思路先看报错关键词判断是数据库层还是模型层。数据库层的错连接、认证、超时跟 callback 无关模型层的错callback、choices才跟本文相关。分清楚能省很多时间。6. 迁移完成后的接入建议把统一 Key 用在长期编码与 Agent 场景代码改完、验证通过迁移就算完成了。但既然已经配好了 TaoToken 的统一 Key不妨把它用在更多地方摊薄配置成本。如果你只是偶尔调一下模型做数据校验用模型对话页就够了https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite。打开就能选模型、发消息适合快速验证。如果你是长期写代码、经常要让模型帮忙改 bug、生成测试、做代码审查那用 Coding Plan 更划算https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite。它面向的就是持续编码场景配合 Claude Code 这类工具Base URL 和 Key 用同一套模型 ID 按需切换。如果你在做 Agent 类项目需要程序化调用、批量处理那就直接用 APIhttps://taotoken.net/apiKey 在控制台管理。文档里有各语言的接入示例Node.js、Python 都有。回到 mongoose 迁移这件事最后给一个实用建议把改写后的代码抽成一个数据访问层所有create、find都走这一层统一用 async/await。这样下次 mongoose 再升级你只需要改一层不用满项目找 callback。我试过在几个项目里这么做升级成本从一天降到一小时。另外迁移脚本跑完后记得清理删掉临时的migrate.js把环境变量写进.env并加进.gitignore别把 Key 提交到仓库。数据库连接串也走环境变量本地和线上用不同配置。到这里Model.create() no longer accepts a callback这个问题应该彻底解决了。核心就三步删 callback、改 await、验证写入。剩下的连接参数和模型接入按上面的配置复制即可。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python路径分析全流程:建模、可视化与Bootstrap中介检验 2026/10/2 18:18:18

Python路径分析全流程:建模、可视化与Bootstrap中介检验

简介:压缩包提供了一套可运行的路径分析 Python 实现,面向需要做因果关系检验、结构方程建模的数据分析与科研用户。代码基于回归分析计算路径系数,并通过 NetworkX 绘制路径图、相关矩阵图、效应对比图,帮助直观理解变量间的直接…

阅读更多 →
AI论文检测率高?双保险降AI法:比话AI改写+手动润色全攻略 2026/10/2 18:18:18

AI论文检测率高?双保险降AI法:比话AI改写+手动润色全攻略

晚上十一点四十七分,我对着三份查重报告发呆——裸检出率9%,AI疑似度86%。这意味着即使我把所有标红的重复段落都改干净,论文大概率还是会被打回来重新写。这是很多同学用AI辅助写作后最真实的困境:文字确实是自己与AI“协作”出来…

阅读更多 →
yolov5果蔬识别数据集实战:从标注到产线部署避坑指南 2026/10/2 18:18:18

yolov5果蔬识别数据集实战:从标注到产线部署避坑指南

简介:这是一套面向计算机视觉初学者与深度学习实践者的YOLOv5果蔬识别完整项目资源,围绕土豆、圣女果、大白菜、大葱、梨、胡萝卜、芒果、苹果、西红柿、韭菜、香蕉、黄瓜等十余类常见果蔬的检测任务展开,可用于课程设计、毕业设计或算法入门…

阅读更多 →
Cursor、Qoder 安装卡在“正在准备安装”:Windows PowerShell 排查与 TaoToken 配置思路 2026/10/2 18:18:18

Cursor、Qoder 安装卡在“正在准备安装”:Windows PowerShell 排查与 TaoToken 配置思路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
幼儿园管理系统Java毕设全攻略:SpringBoot+MySQL从设计到部署 2026/10/2 18:18:18

幼儿园管理系统Java毕设全攻略:SpringBoot+MySQL从设计到部署

要说Java毕设里最经典的一类题目,“管理系统”绝对占大头,而幼儿园管理系统又是管理系统中非常典型的一个细分方向。它不像电商、秒杀系统那样需要扛高并发,也不像推荐系统那样堆算法模型,它的核心就一句话:把复杂的线…

阅读更多 →
珠宝图片自动识别与结构化输出:视觉增强服务部署实战 2026/10/2 18:18:12

珠宝图片自动识别与结构化输出:视觉增强服务部署实战

这次我们来看珠宝在线编辑里的一个视觉增强能力:ds4flushvison。名字看着像是内部代号,但它在工作流里承担的事情非常具体——收到一张珠宝商品图,返回结构化描述、自动归类、长出可检索的标签,然后把这些结果丢给在线编辑页或后台…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉