不能让猫鼬 find().then() 工作

Posted

技术标签:

【中文标题】不能让猫鼬 find().then() 工作【英文标题】:Can not make mongoose find().then() to work 【发布时间】:2020-12-01 00:02:11 【问题描述】:

遇到了 Mongoose 的问题。

import express from 'express';
import Countries from '../models/countries.mjs';

const router = new express.Router();

router.get('/countries-data', async (req, res) => 
  try 
    let countries =
        await Countries.find()
            .select(
                '-_id specimenDate dailyLabConfirmedCases changeInDailyCases')
            .sort('specimenDate');

    if (!countries) return res.status(500).send();

    res.json(countries);
   catch (err) 
    res.status(500).send();
  
);

此代码按预期工作,但我决定删除 async/await 并改用 find().then():

import express from 'express';
import Countries from '../models/countries.mjs';

const router = new express.Router();

router.get('/countries-data', (_, res) => 
  Countries.find()
      .select('-_id specimenDate dailyLabConfirmedCases changeInDailyCases')
      .sort('specimenDate')
      .then((countries) => 
        if (!countries) throw Error('no data');

        res.json(countries);
      )
      .catch(res.status(500).send());
);

在尝试发送 json 数据时出现异常:

UnhandledPromiseRejectionWarning: 错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头

我真的不知道我做错了什么。为什么 catch 没有得到承诺异常?有什么建议吗?

【问题讨论】:

.then 代码没有任何问题,但只是为了再次确定:在 res.json(countries); 之前添加 return; 【参考方案1】:

我认为问题出在您在catch 块中发送的响应,因为catch 接受了一个回调函数,如果有任何错误,该函数会返回一个错误。

试试这个:

import express from 'express';
import Countries from '../models/countries.mjs';

const router = new express.Router();

router.get('/countries-data', (_, res) => 
   Countries.find()
  .select('-_id specimenDate dailyLabConfirmedCases changeInDailyCases')
  .sort('specimenDate')
  .then((countries) => 
    if (!countries) throw Error('no data');

    res.json(countries);
  )
  // refactor your code like this
  .catch((err)=>
   res.status(500).send(err)
  );

);

【讨论】:

以上是关于不能让猫鼬 find().then() 工作的主要内容,如果未能解决你的问题,请参考以下文章

无法让猫鼬 findById() 工作

如何让猫鼬将一组 url 推送到数组子文档

如何让猫鼬列出集合中的所有文档?判断集合是不是为空?

只有当字段包含 ObjectId 时,是不是可以让猫鼬填充混合字段?

查找方法投影中的猫鼬 $literal

waitForAngular 和 "then" 都不能按预期工作