2 回答
TA贡献1772条经验 获得超6个赞
所以你需要改变:
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
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
添加回答
举报