Как связать навык alexa с существующим кластером mongodb atlas - PullRequest
0 голосов
/ 07 февраля 2019

Я довольно плохо знаком с навыками Алексы.Я сделал навык 'hello world' и получил несколько HTTP-запросов.

Теперь я пытаюсь подключить свой навык к существующему атласному кластеру MongoDB.Моя цель - извлечь некоторые данные из моего кластера и использовать их в своем умении, чтобы ответить пользователю, который задал вопрос Алексе.

Я думаю, что установил соединение с атласом, но когда я пытаюсь что-то сделать с моей коллекциейиз БД я получаю сообщение «Ошибка MongoError: Топология была уничтожена».

Как я уже читал, проблема может быть в рабочем процессе из AWS Lambda.Он работает без сохранения состояния, и соединение может быть разорвано, когда я пытаюсь прочитать коллекцию, но я не знаю, как мне решить эту проблему.

Это мой текущий подход к установлению соединения и просто печати счетчика.из моих документов.Я проверил, как перемещать клиентскую часть соединения в моем навыке, но я всегда получаю одну и ту же ошибку.

Текущий подход к установлению соединения


const MongoClient = require('mongodb').MongoClient;
const uri = "mongodb+srv://<USER>:<PASS>@<CLUSTER>?retryWrites=true";
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
    const collection = client.db("database").collection("data");
    console.log(collection.countDocuments());
    client.close();
});

Вот как один Намерениеиз моих навыков выглядит так:


const HelloWorldIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'HelloWorldIntent';
    },
    handle(handlerInput) {
        const speechText = 'Hello World!';
        return handlerInput.responseBuilder
            .speak(speechText)
            //.reprompt('add a reprompt if you want to keep the session open for the user to respond')
            .getResponse();
}};

Вот как выглядит настоящая ошибка:


    Promise {
    <rejected> { MongoError: Topology was destroyed
    at initializeCursor (/var/task/node_modules/mongodb- 
   core/lib/cursor.js:603:25)
    at nextFunction (/var/task/node_modules/mongodb-core/lib/cursor.js:463:12)
    at AggregationCursor.Cursor.next (/var/task/node_modules/mongodb-core/lib/cursor.js:763:3)
    at AggregationCursor.Cursor._next (/var/task/node_modules/mongodb/lib/cursor.js:211:36)
    at fetchDocs (/var/task/node_modules/mongodb/lib/operations/cursor_ops.js:217:12)
    at toArray (/var/task/node_modules/mongodb/lib/operations/cursor_ops.js:247:3)
    at executeOperation (/var/task/node_modules/mongodb/lib/utils.js:420:24)
    at AggregationCursor.Cursor.toArray (/var/task/node_modules/mongodb/lib/cursor.js:824:10)
    at countDocuments (/var/task/node_modules/mongodb/lib/operations/collection_ops.js:233:37)
    at /var/task/node_modules/mongodb/lib/utils.js:437:24 name: 'MongoError', [Symbol(mongoErrorContextSymbol)]: {} } }

1 Ответ

0 голосов
/ 08 февраля 2019

У меня была похожая проблема с другой лямбда-функцией AWS, которая использовалась для подключения MongoDb, и я обнаружил, что нам необходимо предоставить дополнительные параметры для подключения к Mongodb, как указано ниже.

var options = { server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } } }; mongoose.connect(secrets.db, options);

Пожалуйста, попробуйте и дайте мне знать, если это поможет.

...