NodeJS/MongoDB:如何从控制器访问模型中的character枚举字段?
解决方案
有两种简单办法能实现从控制器访问模型里的枚举数组,不用硬编码:
方法一:直接从Mongoose模型的Schema读取枚举值
Mongoose模型自带访问Schema配置的能力,你可以通过Model.schema.path('字段名').enumValues直接拿到定义好的枚举数组。
修改controller.js:
const Test = require('./testModel.js'); // 先导入模型 exports.getCharacterSavestates = catchAsync(async (req, res, next) => { // 直接从模型里取枚举数组 const characters = Test.schema.path('character').enumValues; if (!characters.includes(req.params.character)) { return next(new AppError("Character name invalid"), 400); } const documents = await Test.find({ character: req.params.character }); res.status(200).json({ status: "success", results: documents.length, // 补上你之前漏写的documents data: { data: documents }, }); });
方法二:抽离枚举数组并导出(更直观)
把枚举数组单独定义成变量,在Schema里引用它,同时把这个变量和模型一起导出,控制器直接导入就能用,后续修改枚举值也只需要改一处。
修改testModel.js:
const mongoose = require("mongoose"); // 单独定义枚举数组 const CHARACTER_ENUM = ["mario", "luigi", "link", "samus"]; const testSchema = new mongoose.Schema({ character: { type: String, enum: CHARACTER_ENUM, // 引用这个数组 required: [true, "Please provide a character"], }, }); const Test = mongoose.model("Test", testSchema); // 同时导出模型和枚举数组 module.exports = { Test, CHARACTER_ENUM };
然后在controller.js里用:
const { Test, CHARACTER_ENUM } = require('./testModel.js'); exports.getCharacterSavestates = catchAsync(async (req, res, next) => { // 直接用导入的枚举数组 if (!CHARACTER_ENUM.includes(req.params.character)) { return next(new AppError("Character name invalid"), 400); } const documents = await Test.find({ character: req.params.character }); res.status(200).json({ status: "success", results: documents.length, data: { data: documents }, }); });
两种方法都能用,方法二更推荐,代码结构更清晰,维护起来更方便。
内容的提问来源于stack exchange,提问作者Brenden Baio
相关产品推荐
相关产品推荐

