没有得到猫鼬模型的响应。find()查询

Posted

技术标签:

【中文标题】没有得到猫鼬模型的响应。find()查询【英文标题】:Not getting response from mongoose model.find() query 【发布时间】:2020-09-26 18:20:36 【问题描述】:

我正在尝试使用模型和模式从我的 mongo 数据库中获取所有记录。我能够连接到数据库。当我运行查询时,我没有得到任何响应。

routes.js

import express from 'express';
var router = express.Router();
import mongoose from 'mongoose';
const db = 'mongodb://localhost:27017/dbname';
import contacts from '../models/model.js';

// exports this js file
export  router 

//connect to mongodb

mongoose.createConnection(db,  useNewUrlParser: true , useUnifiedTopology: true , (err, res) => 
       if(err) 
           console.error("Error: "+ err);
       
       else 
           console.log('connected to mongodb');
       
)


router.get('/check', (req, res)=> 
    res.send('in roues');
);

//mongo db 调用

router.get('/contacts', (req, res) => 
    console.log('getting contacts');
   let promise = contacts.find().exec();
   console.log(promise);
   promise.then(function(err, contacts) 
       console.log('in func');
       if(contacts) 
           console.log('data received');
           console.log(contacts);
           res.send('data received');
       
       else 
           console.log('doc not found');
       
   )
)

model.js

    import mongoose from 'mongoose';
    const schema = mongoose.Schema;

    const contactSchema = new schema(
            name: String,
            details: [
                
                    text: String,
                    icon: String
                
            ]
        );

    let contacts = mongoose.model('contacts', contactSchema);

export contacts

控制台输出: (节点:27440) ExperimentalWarning:ESM 模块加载器是实验性的。 服务器启动 连接到mongodb 获取联系人 承诺

【问题讨论】:

contacts.find().exec() 返回的 Promise 不接受与 contacts.find(..., nodeback) 中的 nodeback 相同的参数在 Promise 的情况下,成功传递的值将沿着 Promise 的成功路径或错误向下传递它的错误路径。分支已为您完成。因此,contacts.find().exec().then(successHandler).catch(errorHandler);. 【参考方案1】:

这可能是无法捕获错误的原因。使用 then catchtry catch with async await。

  router.get('/contacts', (req, res) => 
  console.log('getting contacts');
  contacts.find()
    .then(contacts=> 
      console.log(contacts)
    )
    .catch(error=>
     console.log(error.mmessage)
    

我用过 es6 的箭头函数。 你也可以关注try catch with async await

  router.get('/contacts', async(req, res) => 
    try
     console.log('getting contacts');
     const contacts = await contacts.find()
       console.log(contacts)
    
    .catch(error)
     console.log(error.mmessage)
    

【讨论】:

【参考方案2】:

您必须使用 catch 函数处理错误情况,请参阅此链接

https://medium.com/@lucymarmitchell/using-then-catch-finally-to-handle-errors-in-javascript-promises-6de92bce3afc

【讨论】:

【参考方案3】:

.then(...) 只接受一个参数,即解析后的响应。

所以,而不是 promise.then(function(err, contacts) ... );采用 promise.then(function(contacts) ... );

【讨论】:

以上是关于没有得到猫鼬模型的响应。find()查询的主要内容,如果未能解决你的问题,请参考以下文章

我没有得到猫鼬查询用户作为​​返回值

猫鼬查询具有不同值的相同字段

如何在猫鼬模型内的数组中查找对象?

从精益查询的结果创建猫鼬模型

与填充一起使用时,猫鼬查询性能低下

如何从猫鼬集合中检索模式?