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
添加回答
舉報