Mongoose的默认行为是从mongoose.model()
函数的第一个参数推断集合名称.它寻找该参数的复数小写版本.因此,给出以下模型:
const flashcard = mongoose.model('Flashcard', flashcardSchema);
Mongoose将购买Flashcard
件,并寻找flashcards
件藏品.
但是,该函数还带有一个可选的第三个参数,即显式集合名称,如果存在,则在调用mongoose.model
时将使用该参数并覆盖上面描述的默认行为.还可以使用如下所示的变量将其参数化:
// req.body = {user:'bob', collection:'flashy'}
const dynamicName = verifyAndSanitizeFunction(req.body.collection);
const flashcard = mongoose.model('Flashcard', flashcardSchema, dynamicName);
现在,它将查找名为flashy
的集合.为了清楚起见,您也可以只传入一个字符串:
const flashcard = mongoose.model('Flashcard', flashcardSchema, 'flashy');
官方API文档见here.
您可以导出一个返回mongoose.model
的函数,这将允许您在实例化模型时传入集合名称,如下所示:
const mongoose = require('mongoose');
const flashcardSchema = new mongoose.Schema({
name: String,
//...
})
const createModel = (collection) => {
return mongoose.model("Flashcard", flashcardSchema, collection)
}
module.exports = {createModel};
你不需要exports.createFlashcard
的功能,因为它看起来太过工程化了.只需从前端获取集合名称并使用它来创建抽认卡模型,如下所示:
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const {createModel} = require('./models/Flashcard.js');
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post("/flashcard/create", async (req, res) => {
try{
const dynamicName = verifyAndSanitizeFunction(req.body.collection);
const Flashcard = createModel(dynamicName);
const card = await Flashcard.create({
name: req.body.name,
//...
});
res.status(201).json({ card });
} catch (err){
res.status(500).json({ error: err.message });
}
});
如果您真的想这样做,只需将createModel
函数导入到您的exports.createFlashcard
函数中,并从req
对象中获取集合名称,但这由您决定.