NodeJS в AWS Лямбда в пн go Атлас - соединение не установлено без журналов - PullRequest
0 голосов
/ 11 января 2020

Я JS новичок ie, так что это может быть глупой проблемой. У меня есть лямбда, написанная в NodeJS 10.x, и я пытаюсь добавить вставку 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

Элемент не вставлен в Атлас. Я добавил более подробные записи, но они не отображаются. Если мон go соединение не удалось, должна быть ошибка. Но похоже, что обработчики ошибок игнорируются. Где проблема?

1 Ответ

1 голос
/ 11 января 2020

Вы очень близки. Мало чего не хватает

  • Необходимо вызвать функцию обратного вызова из функции обработчика, так как функция вставки не знает о обратном вызове.
  • Когда вы делаете .then в обещании и вы используете фигурные скобки, которые вам нужны, чтобы вернуть то, что находится там, чтобы затем отправить его следующему (если вы не делаете это в одной строке).
  • 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);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...