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