如何解决未处理的承诺拒绝警告使用mongoose连接到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);
}
);
});
解决方法
mongoose.connect
returns a promise。
因此您需要更改:
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
事件resolve
已open
兑现承诺。
您应该configure the reconnection
执行以下操作:const connectToDatabase = new Promise((resolve,reject) => {...
您正在顶层上构建Promise
,然后在startServer
中等待它。
等同于执行此操作:
// Top level Promise rejection
Promise.reject('error');
其余代码仍然有效,因为await
在已经解决的Promise
上工作(也可能Promise
在等待时尚未解决),但是您应该构建{ Promise
内的{1}}代替:
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
仅 上获得引用,然后解决或拒绝该引用,可能的拒绝被捕获,并没有达到最高级别。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。