Лямбда-узлы не вставляются в MongoDB

#javascript #node.js #mongodb #mongoose #aws-lambda

#javascript #node.js #mongodb #mongoose #aws-lambda

Вопрос:

Я пытаюсь скомпилировать лямбда-функцию, которая использует Mongoose, но, похоже, с базой данных ничего не происходит? нет журналов консоли и т.д. Вот мой текущий код:

index.js

 const connectToDatabase = require('./db');
const Match = require('./models/Match');

exports.handler = async (event, context, callback) => {

    context.callbackWaitsForEmptyEventLoop = false;

    let player_1_name = 'test name';

    let player_1_network = 'test network';

    let match_id = 1;

    connectToDatabase().then(() => {

        var MyModel = new Match({
            player_1_name: player_1_name,
            player_1_network: player_1_network,
            match_id: match_id
        });

        MyModel.save().then(() => {
            console.log('Data saved');
        }).catch(e => {
            console.log(e);
        });

    });

});
  

db.js

 const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
let isConnected;

module.exports = connectToDatabase = () => {
  if (isConnected) {
    console.log('=> using existing database connection');
    return Promise.resolve();
  }

  console.log('=> using new database connection');
  return mongoose.connect(process.env.DB, {useMongoClient: true}).then(db => {
    isConnected = db.connections[0].readyState;
  }).catch(e => {
    console.log('Error while DB connecting');
    console.log(e);
  });
};
  

models/Match.js

 const mongoose = require('mongoose');

const MatchSchema = new mongoose.Schema({
    player_1_name: {
        type: String,
        required: true
    },
    player_1_network: {
        type: String,
        required: true
    },
    player_1_matches: {
        type: Number,
        default: 0
    },
    player_1_kills: {
        type: Number,
        default: 0
    },
    player_1_last_updated: {
        type: Date,
        default: null
    },
    player_2_name: {
        type: String,
        default: null
    },
    player_2_network: {
        type: String,
        default: null
    },
    player_2_matches: {
        type: Number,
        default: 0
    },
    player_2_kills: {
        type: Number,
        default: 0
    },
    player_2_last_updated: {
        type: Date,
        default: null
    },
    match_id: {
        type: Number,
        required: true
    },
    status: {
        type: Boolean
    },
});

module.exports = mongoose.model('Match', MatchSchema);
  

При запуске любых тестов, будь то через API Gateway или прямые лямбда-тесты, кажется, что в журнал ничего не добавляется, все, что я получаю в своем журнале, — это очень минимальная информация.

Вот скриншот того, что я на самом деле получаю в своих журналах: введите описание изображения здесь

Ответ №1:

Обратите внимание на строку, которая гласит context.callbackWaitsForEmptyEventLoop = false; . Этот ложный флаг означает следующее: всякий раз, когда lambda завершает выполнение вашей функции-обработчика, она немедленно завершает процесс, даже если в цикле событий что-то осталось для обработки. И в вашем случае ваша функция-обработчик отправляет запрос в mongodb с обещанием, но вы не await выполняете это обещание. Вы просто запускаете его и позволяете ему работать в фоновом режиме, но из-за того ложного флага, о котором я упоминал ранее, lambda немедленно завершит процесс, даже если он видит, что в цикле событий требуется сетевой ввод-вывод для обработки. Вот почему вы даже не видите никаких журналов — операторы then или catch обещания даже не выполняются.

Итак, если вы специально запрашиваете mongodb в фоновом режиме, я рекомендую вам удалить этот ложный флаг. Если вам не нужно делать это в фоновом режиме, добавьте await в свой запрос mongodb.

Комментарии:

1. Спасибо за это, я попытался добавить await в свою функцию, но теперь моя функция просто передается на неопределенный срок?

2. скорее всего, это другая проблема. Находится ли ваш mongodb в частной подсети?