如何通过Mongoose在Koa.js中连接MongoDB
改用Mongoose连接MongoDB的修改步骤
1. 安装Mongoose依赖
先安装Mongoose包:
npm install mongoose # 或者用yarn yarn add mongoose
2. 替换数据库连接代码
删除原来的db/mongoClient.js,创建db/mongoose.js,用Mongoose实现连接:
import mongoose from 'mongoose'; const URI = 'xxxxxxxxxxxxxxxxxxxxx'; // 保留你原有的连接字符串 mongoose.connect(URI) .then(() => console.log("Db connected via Mongoose")) .catch(err => console.error("Database connection error:", err));
3. 创建Post数据模型
在项目中新建models/Post.js,定义对应posts.post集合的Schema和Model:
import mongoose from 'mongoose'; // 定义Post的Schema,匹配你原有的字段结构 const postSchema = new mongoose.Schema({ title: String, description: String, user: String, posted: Date // 如果你的posted是日期类型,否则改成对应类型 }); // 指定关联原有的`post`集合(Mongoose默认会将模型名转为复数集合名,这里手动指定避免自动转换) const Post = mongoose.model('Post', postSchema, 'post'); export default Post;
4. 修改控制器代码
替换原来的控制器逻辑,使用Mongoose的Model API:
import Post from './models/Post.js'; const save = async (post) => { const newPost = await Post.create(post); return newPost._id; // 直接返回生成的_id }; const getAll = async () => { // 使用lean()返回普通JS对象,方便处理字段映射 const posts = await Post.find().lean(); // 将_id转换为id,和原返回格式保持一致 return posts.map(doc => ({ id: doc._id, title: doc.title, description: doc.description, user: doc.user, posted: doc.posted })); }; const getByDataId = async (findId) => { const doc = await Post.findById(findId).lean(); if (!doc) throw new Error('Post not found'); // 可选:添加基础错误处理 return { id: doc._id, title: doc.title, description: doc.description, user: doc.user, posted: doc.posted }; }; export { save, getAll, getByDataId };
5. 调整服务器配置代码
修改数据库连接的导入路径,同时修正CORS响应头的错误(原代码重复设置Access-Control-Allow-Origin,还把Methods字段写错成了Origin):
import Koa from 'koa'; import bodyParser from 'koa-bodyparser'; import postRouter from './postRouter.js'; import './db/mongoose.js'; // 替换为Mongoose的连接文件 const app = new Koa(); app.use(bodyParser()); app.use(postRouter.routes()) .use(postRouter.allowedMethods()); // 修正CORS配置 app.use(async (ctx, next) => { ctx.set('Access-Control-Allow-Origin', '*'); ctx.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE'); ctx.set('Access-Control-Allow-Headers', 'Content-Type'); // 处理OPTIONS预检请求 if (ctx.method === 'OPTIONS') { ctx.status = 204; return; } await next(); }); app.use((ctx) => { ctx.body = 'Resource you are looking for was not found'; ctx.status = 404; }); app.listen(3000); console.log("App is running on port 3000");
关键变化说明
- Mongoose通过Schema和Model封装了集合操作,无需手动获取db和collection实例
- 使用
lean()可以让查询返回普通JavaScript对象,避免Mongoose文档对象的额外属性,方便字段转换 findById方法直接支持传入字符串格式的ID,无需手动转换ObjectId- 修正了服务器代码中CORS响应头的错误配置,确保跨域请求正常处理
内容的提问来源于stack exchange,提问作者user19741127
相关产品推荐
相关产品推荐

