#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 в частной подсети?