【问题标题】:How can I pass schema model in route如何在路由中传递模式模型
【发布时间】:2019-09-01 18:05:08
【问题描述】:

我在控制器文件的函数中定义了一个模式模型,该文件在 MongoDB 中创建了一个新集合。我希望模型在路由文件中传递。我曾尝试根据我的架构执行const Thing = mongoose.model('admin.companyName');,但出现错误:- throw new mongoose.Error.MissingSchemaError(name); MissingSchemaError: Schema hasn't been registered for model "admin.companyName". Use mongoose.model(name, schema) on mongoose lib/ index file。

我在控制器内部的功能:-

admin.save((err, doc) =>{
        if(!err){

            res.send(doc);

        //make copy to Company collection
            let arr = Object.keys(doc.schema.obj); //doc.schema.paths if I need same ID
            let Obj = {};
            arr.map(key => Obj[key] = doc[key]);
            var thingSchema = new mongoose.Schema({}, { strict: false, collection: admin.companyName });
            var Thing = mongoose.model(admin.companyName , thingSchema);
            var thing = new Thing(Obj); 
            thing.save();
            console.log(thing);

我如何将 var Thing = mongoose.model(admin.companyName , thingSchema); 传递给我的路由文件,以便我可以在我的 route 之一中使用:-

注意:- admin.companyName 的架构名称不是固定的,并且会不断变化

const Thing = mongoose.model('admin.companyName'); Thing.updateOne( { emailResetTokenn: emailTokenn },{ $set: { verified: true }},(err) =>{ ......

编辑:- 路由文件

const express = require ('express');
const router = express.Router();
const mongoose = require ('mongoose');
const Admin = mongoose.model('Admin');
const Thing = mongoose.model('Thing');
const ctrlAdmin = require ('../controllers/admin.controller.js');
const jwt = require('jsonwebtoken');


router.get('/verify',function(req,res){

    console.log('request recieved');
    const emailTokenn = req.query.id;
    console.log(emailTokenn);

   Thing.updateOne( { emailResetTokenn: emailTokenn },{ $set: { verified: true }},(err) =>{

    if(!err){
        return res.redirect('https://localhost/something.com/fw18/index.html'); 
    }
    else{
        throw err;
    }
  });
});

【问题讨论】:

  • 猴子在你的快递应用上给模型打补丁并在你的路线示例中使用它们:app.db = mongoose.schema... 在你的路线中const model = app.db
  • 每次在控制器中调用admin.save() 时,都会创建一个新集合。所以Thing 并不是真正的“常数”,它每次都指代具有不同模式的不同模型。如果这是你想要的,那很好。你在哪里导出你的Admin 模型?
  • @Marc 你的意思是说我必须在 server.js 文件中声明app.db =mongoose.model(admin.companyName , thingSchema);
  • @MoadEnnagi 没错,你是对的。这就是我要的。我只在路由器文件const Admin = mongoose.model('Admin'); 上导出我的Admin 模型。代替Thing .. 在Admin.updateOne( { emailResetTokenn: emailTokenn },{ $set: { verified: true }},(err) 之前是Admin
  • req.object 有任何Admin 属性吗?作为router.get('/verify',function(req,res) 中的请求对象,你得到了什么?

标签: node.js express mongoose


【解决方案1】:

如果您正在寻找模型Thing,您可以使用mongoose.modelNames(),它返回一个包含所有已创建模型名称的数组。

const Genre = mongoose.model('Genre', genreSchema);
const Book = mongoose.model('Book', bookSchema);

console.log(mongoose.modelNames()) // gives ['Genre', 'Book']

这只会给您模型名称,您需要弄清楚如何使用admin 属性找到您需要的模型。

编辑 如果您的请求对象中有 Admin 属性,则可以在路由处理程序中获取所需的事物模型:

router.get('/:adminId/verify',function(req,res){
    console.log('request recieved');
    const emailTokenn = req.query.id;
    console.log(emailTokenn);
    Admin.FindOne({_id: req.params.adminId})
       .exec()
       .then(admin => {
          const Thing = mongoose.model(admin.companyName);
          Thing.updateOne( { emailResetTokenn: emailTokenn },{ $set: { verified: true }},(err) =>{})
       })

【讨论】:

  • 不,我主要关心的是如何在我的路线中通过模型Thing
  • 你有没有尝试过?你的意思是把它作为参数传递吗?什么路线?你能显示代码吗?
  • 我有点困惑。我不知道我会在 Admin.FindOne 中找到什么。正如您从管理员控制器中看到的那样,我有两个集合,一个是 admin,另一个是根据 admin.companyName 中传递的任何细节创建的。早些时候,我将 admin 集合中的一个字段设为 true。现在我想在admin.companyName的同一个字段名中做。
  • 你需要找到你刚刚修改的admin文档,得到它的companyName,companyName就是Things的模型名,所以你把它赋值给Thing。你在req.query 中得到了什么数据?
  • 安慰它时我在req.query 中没有得到任何东西。
猜你喜欢
  • 2014-07-17
  • 2011-04-17
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
相关资源
最近更新 更多