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

Javascript 使用mongoose连接到mongoDB的未处理承诺拒绝警告,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,所以我把这段代码(简化了一点)连接到一个数据库,我故意把database\uurl搞错了,所以我得到了一个错误。但我不明白的是我得到未处理PromiserEjectionWarning的原因 有什么想法吗 干杯 try { startServer(); } catch (err) { console.log(err); } async function startServer () { try { await connectToDatabase;

所以我把这段代码(简化了一点)连接到一个数据库,我故意把
database\uurl
搞错了,所以我得到了一个错误。但我不明白的是我得到未处理PromiserEjectionWarning的原因

有什么想法吗

干杯

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);
        }
    );
});


所以你需要改变:

const connectToDatabase=新承诺((解析、拒绝)=>{
猫鼬连接(
process.env.DATABASE_URL,
{
useNewUrlParser:true,
useUnifiedTopology:正确
}
)
.然后(()=>{
const database=mongoose.connection
数据库.on('error',err=>{
日志错误(err);
});
一次(
"开放",,
() => {
console.log('连接到数据库…')
解析(数据库)
}
)
})
.捕获(拒绝)
})
您应该改进此代码:

        database.on('error', err => {
          logError(err);
        });
因为只要在建立连接后出现错误(如断开连接),就会触发此事件

因此,您不能
拒绝已通过
打开
事件
解决
d的承诺。
你应该

所以你需要改变:

const connectToDatabase=新承诺((解析、拒绝)=>{
猫鼬连接(
process.env.DATABASE_URL,
{
useNewUrlParser:true,
useUnifiedTopology:正确
}
)
.然后(()=>{
const database=mongoose.connection
数据库.on('error',err=>{
日志错误(err);
});
一次(
"开放",,
() => {
console.log('连接到数据库…')
解析(数据库)
}
)
})
.捕获(拒绝)
})
您应该改进此代码:

        database.on('error', err => {
          logError(err);
        });
因为只要在建立连接后出现错误(如断开连接),就会触发此事件

因此,您不能
拒绝已通过
打开
事件
解决
d的承诺。

您应该这样做:
const connectToDatabase=newpromise((解析,拒绝)=>{…
您正在顶层上构建一个
Promise
,然后在
startServer
中等待它。 这相当于这样做:

//顶级承诺拒绝

Promise.reject('error');
通过这样做:
const connectToDatabase=newpromise((resolve,reject)=>{…
您正在顶层
上构建一个
Promise,然后在
startServer
中等待它。 这相当于这样做:

//顶级承诺拒绝

Promise.reject('error');
startServer是一个异步函数,在您的try块中,您没有等待它。另外,这里的
wait connectToDatabase;
您是否错过了使用
connectToDatabase()首次调用该函数
?@Kevin.a如果我没弄错的话,你的意思是我必须在另一个异步函数中封装我的第一个try-catch,以便能够使用wait-before
startServer()
。在这种情况下,我不会有另一个未处理的承诺(由添加的异步函数返回的承诺)?@Kevin.a
connectToDatabase
是一个承诺,而不是一个函数StartServer是一个异步函数,在您的try块中,您没有等待它。另外,这里的
wait connectToDatabase;
您是否错过了使用
connectToDatabase()首先调用函数的机会
?@Kevin.a如果我没弄错的话,你的意思是我必须在另一个异步函数中封装我的第一个try-catch,以便能够使用wait-before
startServer()
。在这种情况下,我不会有另一个未处理的承诺(由添加的异步函数返回的承诺)?@Kevin.a
connectToDatabase
是一个承诺,而不是一个功能谢谢你的回答。你对上一句话的看法完全正确,因为错误可能发生在承诺解决后。因此,如果将来出现错误,我应该尝试处理。但我很好奇,在这种情况下,承诺永远不会解决问题nce
DATABASE\u URL
是错误的。除此之外,现在我在
mongoose.connect()
promise之后使用了另一个catch,我仍然收到相同的未处理的promise警告。您添加了
catch(拒绝)了吗
也是吗?最后,在
之后,然后
实际上,连接方法的捕获完成了工作,我没有特别使用您的精确方法,但我可以解决问题,谢谢。谢谢您的回答。您对上一句话的看法完全正确,因为错误可能会在承诺解决后发生。所以我应该这样做如果将来出现错误,请尝试处理。但我很好奇,在这种情况下,承诺永远不会解决,因为
数据库\u URL
是错误的。此外,现在我正在使用
猫鼬.connect()之后的另一个catch
promise,我仍然收到相同的未处理承诺警告。您是否也添加了
.catch(reject)
呢?最后,在
之后,然后
实际上连接方法上的catch起了作用,我没有特别使用您的确切方法,但我可以解决问题,谢谢。