猿问

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

所以我有这个代码(简化了一点)来连接到数据库,我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);

        }

    );

});


拉莫斯之舞
浏览 130回答 2
2回答

梦里花落0921

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

FFIVE

通过这样做:const connectToDatabase = new Promise((resolve, reject) => {...您Promise在顶层构建一个,然后在startServer. 这相当于这样做:// Top level Promise rejectionPromise.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
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答