Express/MongoDB - 向数据库发送请求时如何在 try/catch 块内使用 res.render

问题描述

我正在制作一个投票应用程序,我的一个路由是获取所有投票的 GET 请求。

我想要做的就是将民意调查传递给我的仪表板视图,如果没有民意调查,我也想将错误传递给仪表板视图。

我认为我当前的实现是错误的,因为如果没有轮询,仪表板视图会收到一个空数组,而不是错误

我很好奇在这种情况下最好的方法是什么。

谢谢

router.get('/dashboard',isAuth,async (req,res) => {
    try {
        const polls = await Poll.find().populate('user',['name','id']);
        
        res.render('dashboard',{
            polls
        });
    } catch(err) {
        res.status(400);
        res.render('dashboard',{
            error: 'Could not find any polls'
        });
    }
});

解决方法

如果 polls 为假/空,您可以抛出错误。像这样:

const getType = element => Object.prototype.toString.call(element);

// Put this function in a helper file and use it throughout the source code
const isEmpty = element => {
  if (
    // undefined
    typeof element === 'undefined' ||
    // string
    (typeof element === 'string' && element.trim().length == 0) ||
    // null
    getType(element) === '[object Null]' ||
    // object
    (getType(element) === '[object Object]' && !Object.keys(element).length) ||
    // array
    (getType(element) === '[object Array]' && !element.length)
  ) {
    return true;
  }

  return false;
}

router.get('/dashboard',isAuth,async (req,res) => {
  try {
    const polls = await Poll.find().populate('user',['name','id']);

    if (isEmpty(polls)) {
      throw new Error("Could not find any polls");
    }

    res.render('dashboard',{
      polls
    });
  } catch (err) {
    res.status(400);
    res.render('dashboard',{
      error: 'Could not find any polls'
    });
  }
});