📅  最后修改于: 2023-12-03 15:22:14.437000             🧑  作者: Mango
本文将介绍如何使用 Mongoose 和 MongoDB 实现图像的上传和检索功能。Mongoose 是一个基于 Node.js 的 MongoDB 对象模型工具,可以方便地操作 MongoDB 数据库。
在开始之前,我们需要安装 Mongoose 和 Multer 这两个 Node.js 模块。
npm install mongoose multer
在 Node.js 中,我们可以使用 Multer 中间件来处理图像的上传。Multer 会将上传的文件存储在指定的目录中。
在 Express 应用中,我们可以使用以下代码来配置 Multer 中间件:
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
在上面的代码中,我们将上传的图像存储在名为 uploads
的目录中。
接下来,我们需要为上传的图像创建一个 Mongoose 模型。以下是一个示例模型:
const mongoose = require('mongoose');
const { Schema } = mongoose;
const ImageSchema = new Schema({
name: String,
originalName: String,
path: String,
size: Number,
}, { timestamps: true });
const Image = mongoose.model('Image', ImageSchema);
module.exports = Image;
在模型中,我们定义了四个属性,分别表示:
name
:文件名,由服务器自动生成。originalName
:原始文件名。path
:文件在服务器上存储的路径。size
:文件大小。我们使用 mongoose.model
方法将模型注册到 Mongoose 中并导出它。
现在我们可以创建一个路由来处理图像的上传。以下是一个简单的示例:
const express = require('express');
const router = express.Router();
const Image = require('../models/image');
router.post('/upload', upload.single('image'), async (req, res) => {
const { originalname, size, path } = req.file;
const image = new Image({ originalName: originalname, size: size, path: path });
await image.save();
res.status(201).json({ message: 'Image uploaded successfully.' });
});
module.exports = router;
在上面的代码中,我们使用 multer 中间件的 single
方法来处理图像的上传,并将接收到的文件信息存储到 MongoDB 数据库中。
现在我们可以通过访问数据库来检索上传的图像。以下是一个示例查询语句:
Image.find({}).sort({ createdAt: -1 }).limit(limit).skip(skip).exec();
在上面的代码中,我们使用 Mongoose 的 find
方法来查找所有的图像,然后使用 sort
方法对它们进行按日期降序排列,使用 limit
和 skip
方法来分页显示。
以下是一个完整的示例路由:
router.get('/images', async (req, res) => {
const { page, limit } = req.query;
const skip = (page - 1) * limit;
const images = await Image.find({}).sort({ createdAt: -1 }).limit(limit).skip(skip).exec();
res.json(images);
});
在上面的代码中,我们使用 Express 的 req.query
方法来获取 URL 查询参数,然后使用这些参数来计算 skip
和 limit
值。最后,我们使用 Image.find
方法来检索图像,并将它们作为 JSON 数据返回。
使用 Mongoose 和 Multer,我们可以方便地将图像上传到 MongoDB 数据库中,并提供基于 MongoDB 的检索功能。在实际应用中,我们可以根据需要对模型和路由进行微调来满足具体的需求。