Lambda NodeJS не вставляется в MongoDB - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь скомпилировать функцию 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-шлюз или прямые лямбда-тесты, ничего не добавляется в журнал, всеЗахожу на мой журнал очень минимальной информации.

Вот скриншот того, что я на самом деле получаю в своих журналах: enter image description here

1 Ответ

1 голос
/ 13 марта 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...