【问题标题】:NodeJS in AWS Lambda to Mongo Atlas - connection fails with no logsAWS Lambda 中的节点 JS 到 Mongodb Atlas - 连接失败且没有日志
【发布时间】:2020-01-11 12:31:04
【问题描述】:

我是 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

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

【问题讨论】:

  • 请注意,您有多个callback 调用(在connectToDatabaseinsertUser 中)都将失败,因为callback 未定义。
  • 应该不会抓到检测吧?
  • 你是在暗示这是一个深思熟虑的策略吗?
  • 我不是在问,而是在问。我希望 catch 语句可以捕获各种错误,不是吗?
  • 这意味着它从未尝试执行该回调,因此从未触发异常。您的整个 Lambda 在到达该点之前已完成、失败或超时。

标签: node.js mongodb aws-lambda


【解决方案1】:

你很亲密。少了一些东西

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

我建议使用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);
  }
};

【讨论】:

  • 您好,我注意到您将单引号更改为双引号。然后从 JSON 参数中删除引号并在 insert 方法中添加 then 语句。连接方法中的错误处理程序具有回调。谢谢。我部署了 lambda,但没有任何变化。我没有看到成功的连接日志。
  • 忽略引号。这是我的 IDE 的 linter 改变的东西。你在 lambda 中得到了什么?你能看到任何控制台日志吗?它给出超时错误?你可以粘贴回复吗?
  • INFO 连接 mongo 数据库 INFO 完成的 mongo 东西
  • “连接成功”和“发生连接错误:”均未记录。为什么?
  • 你检查过 lambda 超时吗?默认为 3 秒
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2022-06-20
  • 2015-02-15
  • 2018-06-13
  • 2020-01-29
  • 1970-01-01
  • 2021-01-18
  • 2019-10-23
相关资源
最近更新 更多