为了账号安全,请及时绑定邮箱和手机立即绑定

使用猫鼬连接到 mongoDB 的未处理承诺拒绝警告

使用猫鼬连接到 mongoDB 的未处理承诺拒绝警告

拉莫斯之舞 2022-12-29 13:51:03
所以我有这个代码(简化了一点)来连接到数据库,我DATABASE_URL故意错了所以我得到了一个错误。但我不明白的是我得到的原因UnhandledPromiseRejectionWarning。有任何想法吗?干杯!try {    startServer();} catch (err) {    console.log(err);}async function startServer () {    try {        await connectToDatabase;    } catch ( err ) {        throw err;    }}const connectToDatabase = new Promise((resolve, reject) => {    mongoose.connect(        process.env.DATABASE_URL,        {            useNewUrlParser: true,            useUnifiedTopology: true,        }    );    const database = mongoose.connection;    database.on(        'error',        err => reject(err)    );    database.once(        'open',        () => {            console.log('Connected to database...');            resolve(database);        }    );});
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

mongoose.connect返回一个承诺

所以你需要改变:

 const connectToDatabase = new Promise((resolve, reject) => {

    mongoose.connect(

      process.env.DATABASE_URL,

      {

        useNewUrlParser: true,

        useUnifiedTopology: true

      }

    )

      .then(() => {

        const database = mongoose.connection

       

        database.on('error', err => {

          logError(err);

        });

        database.once(

          'open',

          () => {

            console.log('Connected to database...')

            resolve(database)

          }

        )

      })

      .catch(reject)

  })

你应该改进这段代码:


        database.on('error', err => {

          logError(err);

        });

因为只要在建立连接后出现错误(如断开连接),就会触发此事件。


所以你不能对事件reject做出承诺。您应该配置重新连接resolveopen



查看完整回答
反对 回复 2022-12-29
?
FFIVE

TA贡献1797条经验 获得超6个赞

通过这样做:const connectToDatabase = new Promise((resolve, reject) => {...您Promise在顶层构建一个,然后在startServer. 这相当于这样做:


// Top level Promise rejection

Promise.reject('error');


其余代码仍然有效,因为await它适用于已经解决的问题Promise(也可能Promise在等待时尚未解决),但您应该构建Promise内部 a function:


try {

    startServer();

} catch (err) {

    console.log(err);

}


async function startServer () {

    try {

        await connectToDatabase();

    } catch ( err ) {

        throw err;

    }

}


function connectToDatabase() {

    return new Promise((resolve, reject) => {

        mongoose.connect(

            process.env.DATABASE_URL, {

            useNewUrlParser: true,

            useUnifiedTopology: true,

        });

        const database = mongoose.connection;

        database.on(

            'error',

            err => reject(err));

        database.once(

            'open',

            () => {

            console.log('Connected to database...');

            resolve(database);

        });

    });

}

有了这个,您在创建后立即获得new Promise only in的引用,然后它解决或拒绝并且可能的拒绝被捕获并且不会冒泡到顶层。startServer


查看完整回答
反对 回复 2022-12-29
  • 2 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信