如何在Mongoose Schema中配置文件附件?使用File类型报错
Mongoose中配置文件附件报错:Error: File is not defined 解决方法
问题根源
Mongoose根本没有内置的File类型,你代码里写的type: File中的File是一个未定义的变量,这就是报错的直接原因。
解决方案
根据你实际的文件存储需求,选下面两种方案之一:
方案1:存储文件路径/URL(推荐)
大多数场景下,我们不会直接把文件存在MongoDB里,而是把文件上传到服务器本地或者云存储,然后把文件的路径或URL存在数据库中。这也是你之前用String类型能正常运行的原因,直接沿用这个思路即可:
const mongoose = require('mongoose'); const { Schema } = mongoose; const NoteSchema = new Schema({ user: { type: mongoose.Schema.Types.ObjectId, ref: 'user', }, title: { type: String, required: true, }, // 改成String类型存储文件路径/URL attachmentUrl: { type: String, required: true, }, tag: { type: String, default: 'General', }, date: { type: Date, default: Date.now, }, }); module.exports = mongoose.model('notes', NoteSchema);
注:我把字段名从description改成了attachmentUrl,更贴合用途,你也可以保留原字段名,只改类型。
方案2:存储文件二进制数据(不推荐)
如果一定要把文件的二进制内容存在MongoDB里,可以用Mongoose的Buffer类型:
const mongoose = require('mongoose'); const { Schema } = mongoose; const NoteSchema = new Schema({ user: { type: mongoose.Schema.Types.ObjectId, ref: 'user', }, title: { type: String, required: true, }, // 用Buffer类型存储二进制文件数据 attachmentData: { type: Buffer, required: true, }, // 建议额外存文件的MIME类型,方便后续读取 attachmentMimeType: { type: String, required: true, }, tag: { type: String, default: 'General', }, date: { type: Date, default: Date.now, }, }); module.exports = mongoose.model('notes', NoteSchema);
这种方式会让你的数据库体积快速膨胀,读写性能也会受影响,只适合极小的文件场景。
额外提示
处理文件上传时,你需要用multer这类中间件来接收前端上传的文件,再根据选择的方案把路径或二进制数据存入数据库,不是直接在Schema里用不存在的File类型。
内容的提问来源于stack exchange,提问作者CodeWithSaadi
相关产品推荐
相关产品推荐

