我对NodeJS非常陌生。我正在尝试创建一个与mongoDB Atlas数据库建立连接的简单服务器,但是在运行服务器时出现此错误:
UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个 由抛出异步函数引起的错误 没有障碍,或者拒绝了没有 用.catch()处理。 (拒绝ID:1)(节点:8825)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的Node.js进程。
基于我搜索过的内容,这似乎是一个常见问题,我添加了try / catch,但仍然无法正常工作。
'use strict';
//const AWS = require('aws-sdk');
const express = require('express');
const mongoose = require('mongoose');
const uuidv4 = require('uuid/v4');
//exports.handler = (event, context, callback) => {
mongoose.connect(
'mongodb+srv://xxxx:xxxx@cluster0-us8bq.mongodb.net/test?retryWrites=true',
{
useNewUrlParser: true
}
),
() => {
try {
//something
} catch (error) {
console.error(error);
}
};
const connection = mongoose.connection;
connection.once('open', () => {
console.log('? Connection to DB was succesful');
});
const app = express();
app.listen({ port: 4800 }, () =>
console.log(`? Server ready at http://localhost:4800`)
);
答案 0 :(得分:1)
猫鼬连接返回诺言,并且很可能在尝试连接时出错:我建议使用异步函数来处理数据库连接。这是我目前使用的。
const config = require('config').db; // Your DB configuration
const combineDbURI = () => {
return `${config.base}${config.host}:${config.port}/${config.name}`;
};
// Connecting to the database
const connect = async function () {
const uri = combineDbURI(); // Will return DB URI
console.log(`Connecting to DB - uri: ${uri}`);
return mongoose.connect(uri, {useNewUrlParser: true});
};
然后使用await在异步函数中调用它:
(async () => {
try {
const connected = await connect();
} catch(e) {
console.log('Error happend while connecting to the DB: ', e.message)
}
})();
或者您可以不使用Promise API进行呼叫:
connect().then(() => {
console.log('handle success here');
}).catch((e) => {
console.log('handle error here: ', e.message)
})
此外,在使用回调时使用try catch没有意义,当您没有承诺时,应该使用错误回调来捕获错误。
所以回答您的问题(如评论中提到的其他问题):
当connect函数返回一个promise时,您应该使用catch回调来捕获promise拒绝。否则,它将抛出未处理的承诺拒绝。
我希望这会有所帮助。
答案 1 :(得分:1)
UnhandledPromiseRejectionWarning
意味着承诺应具有.catch()
像
mongoose.connect(...).catch(err => console.log(err))