首页 文章

Mongoose findOne返回Null对象值

提问于
浏览
0

我成功地在mongodb罗盘中保存了一些文件 . 我试图通过查询一些参数来检索值 .

我知道mongodb findOne有 query, fields(by default value: all), options and callback 之类的参数,但是操作的结果返回null并抛出一个类型错误 .

这是我的代码:

router.get('/edit-page/:slug',(req,res) => {
  console.log('slug:\t' + req.params.slug);
  Pages.findOne({slug: req.params.slug},(errs, page) => {
    if(errs){
      req.flash('danger', 'page not found');
      console.error(errs);
    } else {
      console.log(page);
      res.render('admin/edit_page',{
        title: page.title,
        slug: slug,
        content: page.content,
        id: page._id
      });
    }
  });
});

mongo指南针中我的数据结构的副本:

{   
  "_id":"5a9568fa5ce418423ca8e29f",
  "title":"Home",
  "slug":"home",
  "content":"Home Page for Node CMS Cart",
  "sorting":100,
  "__v":0
}

错误抛出:

GET /admin/routes 200 8.634 ms - 3064
slug:    about-us
null
events.js:183
     throw er; // Unhandled 'error' event
     ^

TypeError: Cannot read property 'title' of null
    at Pages.findOne (E:\nodeCMSApp\routes\admin_routes.js:98:29)
    at model.Query.<anonymous> 
(E:\nodeCMSApp\node_modules\mongoose\lib\model.js:3928:16)
    at E:\nodeCMSApp\node_modules\kareem\index.js:297:21
    at E:\nodeCMSApp\node_modules\kareem\index.js:135:16
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
[nodemon] app crashed - waiting for file changes before starting...

我似乎不明白为什么在我的回调中,我无法获得对 page.title 的引用,因为未指定的默认字段是所有字段 .

PS:Pages是我的模特课 .

如果是这样,我该如何解决这个问题?谢谢 .

2 回答

  • 1

    代码很好,你需要处理这个条件 .

    router.get('/edit-page/:slug', (req, res) => {
        console.log('slug:\t' + req.params.slug);
        Pages.findOne({
            slug: req.params.slug
        }, (errs, page) => {
            if (errs) {
                req.flash('danger', 'page not found');
                console.error(errs);
            } else {
                console.log(page);
                if (page) {
                    res.render('admin/edit_page', {
                        title: page.title,
                        slug: slug,
                        content: page.content,
                        id: page._id
                    });
                } else {
                    res.status(400).send('Error message');
                }
            }
        });
    });
    
  • 0
    router.get('/edit-page/:slug', (req, res) => {
          Page.findOne({slug : req.params.slug}).then((page) => {
            if(!page) { //if page not exist in db
              return res.status(404).send('Page not found');
            }
            res.render('admin/edit_page', { //page  exist
              title: page.title,
              slug: page.slug,
              content: page.content,
              id: page._id
            });
          }).catch((e) => {//bad request 
            res.status(400).send(e);
          });
        });
    

    使用此代码它将工作的逻辑是相同的,但我已经使用promises处理条件,它肯定对我有用 . 希望它能帮到你:)

相关问题