未处理的承诺拒绝。此错误是由于抛出异步函数内部而引起的 - NodeJS

2024-03-03

我对 NodeJS 很陌生。我正在尝试创建一个与我的 mongoDB Atlas 数据库连接的简单服务器,但是当我运行我的服务器时,我收到此错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这 错误是通过抛出异步函数内部而产生的 没有 catch 块,或者拒绝一个不符合的承诺 用 .catch() 处理。 (拒绝 ID:1)(节点:8825)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。在 未来,承诺拒绝未处理的将终止 具有非零退出代码的 Node.js 进程。

根据我搜索的内容,这似乎是一个常见问题,我添加了 try/catch 但它仍然不起作用。

'use strict';
    //const AWS = require('aws-sdk');
    const express = require('express');
    const mongoose = require('mongoose');
    const uuidv4 = require('uuid/v4');

    //exports.handler = (event, context, callback) => {
    mongoose.connect(
      'mongodb+srv://xxxx:[email protected] /cdn-cgi/l/email-protection/test?retryWrites=true',
      {
        useNewUrlParser: true
      }
    ),
      () => {
        try {
          //something
        } catch (error) {
          console.error(error);
        }
      };
    const connection = mongoose.connection;

    connection.once('open', () => {
      console.log('???? Connection to DB was succesful');
    });

    const app = express();
    app.listen({ port: 4800 }, () =>
      console.log(`???? Server ready at http://localhost:4800`)
    );

Mongoose connect 返回承诺,并且很可能在尝试连接时出现错误:我建议使用异步函数来处理数据库连接。这是我目前使用的。

const config = require('config').db; // Your DB configuration 
const combineDbURI = () => {
   return `${config.base}${config.host}:${config.port}/${config.name}`;
};

// Connecting to the database
const connect = async function () {
  const uri = combineDbURI(); // Will return DB URI 
  console.log(`Connecting to DB - uri: ${uri}`);
  return mongoose.connect(uri, {useNewUrlParser: true});
};

然后使用await 在异步函数中调用它:

 (async () => {
   try {
    const connected = await connect();
   } catch(e) {
    console.log('Error happend while connecting to the DB: ', e.message)
   }
 })();

或者您可以使用 Promise API 进行调用而无需等待:

 connect().then(() => {
    console.log('handle success here');
 }).catch((e) => {
    console.log('handle error here: ', e.message)
 })

此外,在使用回调时使用 try catch 没有意义,当你没有 Promise 时,你应该使用错误回调来捕获错误。

所以回答你的问题(正如其他人在评论中提到的):

当 connect 函数返回一个 Promise 时,您应该使用 catch 回调来捕获 Promise 拒绝。否则,它将抛出 Unhandled Promise Rejection。

我希望这个能帮上忙。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未处理的承诺拒绝。此错误是由于抛出异步函数内部而引起的 - NodeJS 的相关文章

  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • Bootstrap 标签栏平滑移动导航按钮

    我有一个用于切换块的普通引导选项卡面板 在导航中切换块时 活动选项卡会突出显示 但现在 当我单击活动选项卡的背景时 它会立即发生变化 是否可以使切换选项卡时背景不会立即改变 而是根据需要哪个选项卡而平滑地左右移动 这可以用以下方法完成吗cs
  • HTML 和 标签有什么区别?

    HEAD 标签和 BODY 标签有什么区别 大多数 HTML 书籍仅 简短 提及 and 标签 但它们消失得很快 它们会影响浏览器呈现网页的方式吗 另外 它们会影响 javascript 的运行顺序吗 我的意思是 如果我里面有一个javas
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • jQuery UI Datepicker 奇怪的行为

    我在使用 jqueryUI 使用简单的日期选择器时遇到了一个奇怪的问题 我只想显示两个月的日历 包括上个月和当前月份 我使用了这段代码 function picker datepicker numberOfMonths 2 showCurr
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • Visual Studio 改变 Ctrl-K-D 的工作方式

    In Visual Studio I m using 2012 is there any way of editing the way that Ctrl K D combinations handles its Auto Formatti
  • 角度垫排序不适用于带点表示法的 matColumnDef

    我正在尝试按列对表进行排序 当我必须过滤另一个结果中的结果时 就会出现问题 我尝试通过括号表示法和点表示法访问该属性 但没有给出结果 还将最终节点放置在 matColumnDef 中 但失败 因为有 2 列同名 table table
  • 如何设置必须输入特定数字的字段?

    我想知道如何创建一个需要输入特定数字或文本的字段 例如 激活码 以及在输入的确认答案的情况下移动到 网页 并且在未确认的情况下移动到 另一页面 的按钮 使用必需的属性
  • fadeOut() 和slideUp() 同时进行?

    我已经发现jQuery 淡出然后滑动 https stackoverflow com questions 734554 jquery fadeout then slideup这很好 但不是那个 我怎么能够fadeOut and slideU
  • 如何在 JavaScript 中将变量的内容写入文件[重复]

    这个问题在这里已经有答案了 可能的重复 firefox 如何启用本地 JavaScript 来读取 写入我的 PC 上的文件 https stackoverflow com questions 2846045 firefox how to
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 将两个数字相加将它们连接起来而不是计算总和

    我将两个数字相加 但没有得到正确的值 例如 做1 2返回 12 而不是 3 我在这段代码中做错了什么 function myFunction var y document getElementById txt1 value var z do
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti
  • 如何使用 AMQP 以“PeekLock”模式从 Azure 服务总线队列获取消息?

    我们正在尝试在 Node 应用程序中使用 Azure 服务总线 我们的要求是从队列中获取多条消息 由于Azure SDK for Node不支持批量检索 我们决定使用AMQP 虽然我们能够使用 Peek Messages 获取消息 如此处所
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字

随机推荐