Лямбда не будет писать на mongodb, но я могу писать на него локально - PullRequest
0 голосов
/ 09 апреля 2020

Я использую aws lambdas, которые я развертываю через serverless.com на aws, и пишу в mongodb, используя строку подключения. Это все работает при локальном вызове лямбды, и я проверил, что данные, которые я записываю на него локально, имеют тот же формат, что и записи на живой, и это так. Я понятия не имею, что не так, потому что я не получаю ошибки.

    "use strict";
    module.exports.addNewMenuItem = async event => {
        var MongoClient = require('mongodb').MongoClient;
        const options = {
            socketTimeoutMS: 30000,
            keepAlive: true,
            reconnectTries: 30000,
            useUnifiedTopology: true  , 
            useNewUrlParser: true 
        };
        ;

        console.log(process.env.MONGO_CONNECTION_STRING)
        console.log("eb", event.body)
        const { coffee_type, coffee_subtype, business_id } = event.body
        const client = new MongoClient(process.env.MONGO_CONNECTION_STRING, options);
        await client.connect(clientConnectError => {
            if (clientConnectError) {
                console.log("client connection error", clientConnectError)
            }

            client.db("Coffee2Go").collection("MenuItems").insertOne({ coffee_type, coffee_subtype, business_id }, function (writeError, result) {
                if (writeError) {
                    console.log("db error", writeError)
                }

                console.log("added the new menu item successfully")
            });
        });

        return {
            "body": "menu item added successfully",
            "headers": {
                "Access-Control-Allow-Origin": "*"
            },
            "statusCode": 200
        };
    };

Logs with mongodb connection string blurred

1 Ответ

0 голосов
/ 10 апреля 2020

Как видите, ваша функция занимает всего 6,78 мс до окончания sh, это означает, что функция не дожидается вашего запроса окончательно sh, она просто возвращает объект немедленно. Функция остановится, когда она достигнет return.

На вашей локальной стороне запрос Mongodb все еще выполняется, когда ваша функция получает return. Но он не работает на лямбда-стороне, когда функция останавливается, он останавливает весь процесс.

Основная причина в том, что вы смешиваете синтаксис async/await с синтаксисом callback для MongoClient.

await client.connect(clientConnectError => { // does not make sense 

Как Mongodb document , вы можете использовать их метод в качестве Обещаний.

"use strict";
module.exports.addNewMenuItem = async event => {
  var MongoClient = require('mongodb').MongoClient;
  const options = {
    socketTimeoutMS: 30000,
    keepAlive: true,
    reconnectTries: 30000,
    useUnifiedTopology: true,
    useNewUrlParser: true
  };
  ;

  console.log(process.env.MONGO_CONNECTION_STRING)
  console.log("eb", event.body)
  const { coffee_type, coffee_subtype, business_id } = event.body
  const client = new MongoClient(process.env.MONGO_CONNECTION_STRING, options);

  try {
    await client.connect() // return Promise if no callback passed
    await client.db("Coffee2Go").collection("MenuItems").insertOne({ coffee_type, coffee_subtype, business_id })
    console.log("added the new menu item successfully")
  } catch(err) {
    console.log("db error", writeError)
    // As your original logic. The error will not effect to result of the function.
    // But, I think this is not a good flow, you need tell to your client that process get back an error in this case
    return {
      "body": JSON.stringify({
        message: "Insert item error",
        error: err.message
      }),
      "headers": {
        "Access-Control-Allow-Origin": "*"
      },
      "statusCode": 500 // instead of 200 - success
    };
  }

  return {
    "body": "menu item added successfully",
    "headers": {
      "Access-Control-Allow-Origin": "*"
    },
    "statusCode": 200
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...