将Lambda的Mongo Atlas与NodeJS连接-没有错误处理

问题描述 投票:0回答:1

我是JS新手,所以这可能有些愚蠢。我有一个用NodeJS 10.x编写的lambda,并且试图添加MongoDB Atlas插入。我已经从本教程开始:https://docs.atlas.mongodb.com/best-practices-connecting-to-aws-lambda/

这是我的代码:

const MongoClient = require('mongodb').MongoClient;
let cachedDb = null;

function connectToDatabase (uri) {
    console.log('Connect to mongo database');

    if (cachedDb) {
        console.log('Using cached database instance');
        return Promise.resolve(cachedDb);
    }

    return MongoClient.connect(uri)
        .then(db => {
            console.log('Successful connect');
            cachedDb = db;
            return cachedDb;
        }).catch(err => {
            console.log('Connection error occurred: ', err);
            callback(err);
        });
}

function insertUser(db, email) {
    console.log('=> modify database');
    return db.collection('users').insertOne({"email" : email})
        .then(() => { callback(null, result); })
        .catch(err => {
            console.log('Insert error occurred: ', err);
            callback(err);
        });
}

exports.handler = (payload, context, callback) => {
    const { email, password } = JSON.parse(payload.body);

    context.callbackWaitsForEmptyEventLoop = false;
    connectToDatabase(MONGODB_URI)
        .then(db  => {
            console.log('Mongo connected')
            insertUser(db, email);
            })
        .then(result => {
            console.log('Mongo insert succeeded', result);
        })
        .catch(err => {
            console.log('Mongo insert failed', err);
            return responses.INTERNAL_SERVER_ERROR_500(err, callback, response);
        });

    console.log('finished mongo stuff');

我可以在CloudWatch中看到以下日志:

START RequestId: 0338d336-7d33-40d5-abc7-1511f1c9ea4c Version: $LATEST
2020-01-11T12:18:00.808Z    0338d336-7d33-40d5-abc7-1511f1c9ea4c    INFO    Connect to mongo database
2020-01-11T12:18:00.855Z    0338d336-7d33-40d5-abc7-1511f1c9ea4c    INFO    finished mongo stuff
2020-01-11T12:18:01.416Z    0338d336-7d33-40d5-abc7-1511f1c9ea4c    ERROR   (node:8) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
END RequestId: 0338d336-7d33-40d5-abc7-1511f1c9ea4c

该项目未插入地图集。我添加了更多详细的日志记录,但未显示。如果mongo连接失败,将出现错误。但是似乎错误处理程序被忽略了。问题出在哪里?

node.js mongodb aws-lambda
1个回答
0
投票

您非常亲密。缺少一些东西

  • 回调函数需要从您的处理函数中调用,因为插入函数不知道回调。
  • [当对promise进行.then且使用花括号时,您需要返回其中的任何内容以将其发送到下一个(除非您在一行中执行此操作)。

我已经为此修改了代码。希望它能工作

const MongoClient = require("mongodb").MongoClient;
let cachedDb = null;

function connectToDatabase(uri) {
  console.log("Connect to mongo database");

  if (cachedDb) {
    console.log("Using cached database instance");
    return Promise.resolve(cachedDb);
  }

  return MongoClient.connect(uri)
    .then(db => {
      console.log("Successful connect");
      cachedDb = db;
      return cachedDb;
    })
    .catch(err => {
      console.log("Connection error occurred: ", err);
    });
}

function insertUser(db, email) {
  console.log("=> modify database");
  return db
    .collection("users")
    .insertOne({ email: email })
    .catch(err => {
      console.log("Insert error occurred: ", err);
      callback(err);
    });
}

exports.handler = (payload, context, callback) => {
  const { email, password } = JSON.parse(payload.body);

  context.callbackWaitsForEmptyEventLoop = false;
  connectToDatabase(MONGODB_URI)
    .then(db => {
      console.log("Mongo connected");
      return insertUser(db, email);
    })
    .then(result => {
      console.log("Mongo insert succeeded", result);
      callback(null, result);
    })
    .catch(err => {
      console.log("Mongo insert failed", err);
      callback(err, null);
      return responses.INTERNAL_SERVER_ERROR_500(err, callback, response);
    });
};

顺便说一句,您可以使用async/await而不是回调样式来使其变得简单。如果您决定使用它,请使用等效代码

exports.handler = async (payload) => {
  try {
    const { email, password } = JSON.parse(payload.body);

    const db = await connectToDatabase(MONGODB_URI);
    console.log("Mongo connected");
    const result = await insertUser(db, email);
    console.log("Mongo insert succeeded", result);
    return result;
  } catch(err) {
    console.error(err);
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.