You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:50:25