亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用貓鼬連接到 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 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號