我已经创建了一个模型:

const mongoose = require('mongoose');

const flashcardSchema = new mongoose.Schema({
...
});

const flashcard = mongoose.model('Database', flashcardSchema);
module.exports = flashcard;

‘数据库’--这个参数代表MongoDB中一个集合的名称,但我想让它成为动态的. 因此,我可以将其修改为:

 const collectioName= 'collection'
 const flashcard = mongoose.model(collectioName, flashcardSchema);
 module.exports = flashcard

但问题是,我通过create()方法创建并保存了闪存卡:

   exports.createFlashcard = async (req, res, next) => 
    try {
        const newFlashcard= await Flashcard.create({})

并且我没有访问常量集合名的权限. 我是不是应该在以下内容上加上第四个条款:

 exports.createFlashcard = async (req, res, next, collectionName) => 
        try {
            const newFlashcard= await Flashcard.create({})

并以某种方式将其传递给创建函数?如何让它发挥作用?

它想要它,这样我就可以从前端调用createFlashCard(集合名称

推荐答案

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对象中获取集合名称,但这由您决定.

Javascript相关问答推荐

如何在pixi js中画一条简单的线

响应式JS DataTable中的Bootstrap 5弹出程序无法正常工作

想要检测字符串中的所有单词

使用NgDeliverentOutlet和动态内容投影的Angular 渲染组件

JS、C++和C#给出不同的Base 64 Guid编码结果

有条件的悲剧

Phaser框架-将子对象附加到Actor

. NET中Unix时间转换为日期时间的奇怪行为

Mongoose post hook在使用await保存时不返回Postman响应

将核心模块导入另一个组件模块时存在多个主题

闭包是将值复制到内存的另一个位置吗?

如何在不影响隐式类型的情况下将类型分配给对象?

Use Location位置成员在HashRouter内为空

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

FireBase云函数-函数外部的ENV变量

使用jQuery find()获取元素的属性

如何根据输入数量正确显示alert ?

如何根据查询结果重新排列日期

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

为什么NULL不能在构造函数的.Prototype中工作