未处理的承诺被拒绝。该错误是由内部异步函数引发的-NodeJS

时间:2019-06-05 17:54:52

标签: javascript node.js async-await

我对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`)
    );

2 个答案:

答案 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))