Оказывается, вы можете создавать функции в MongoDB Stitch , что позволяет загружать внешние зависимости .
Однако есть ограничение, например, cheerio не работал как загруженная внешняя зависимость, пока работал запрос. Таким образом, решение состоит в том, чтобы создать функцию без сервера в лямбде AWS, а затем подключить стежок mongoDB к AWS лямбда (стежок mongoDB может подключаться ко многим сторонним сервисам, включая многие облачные сервисы AWS lambda, такие как лямбда, s3, kinesis, et c).
AWS lambda позволяет загружать любые внешние зависимости, если для любого стежка mongoDB нам не нужна лямбда, но для стежка по-прежнему требуется много поддержки. В моем случае у меня была функция узла с cheerio & request в качестве внешних зависимостей, чтобы загрузить это в lambda: создать учетную запись, создать новую функцию lambda и упаковать свои модули и код узла в zip-файл, чтобы загрузить его. Ваш почтовый индекс должен выглядеть следующим образом:
, а файл, содержащий функцию, должен выглядеть следующим образом:
const cheerio = require("cheerio");
const request = require("request");
exports.rss = function(event, context, callback) {
request(event.requestURL, function(error, response, body) {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(body);
const webpageTitle = $("title").text();
const metaDescription = $("meta[name=description]").attr("content");
const webpage = {
title: webpageTitle,
metaDescription: metaDescription
};
callback(null, webpage);
return webpage;
} else {
callback(null, {message: "THIS IS AN ERROR"})
return {message: "THIS IS AN ERROR"};
}
});
};
, а в mongoDB подключиться к третьей стороне выберите 1026 *, введите секретные ключи, которые вы получили при создании пользователя IAM amazon. В правилах -> действия выберите lambda в качестве своего API и разрешите все действия. Теперь в ваших функциях стежков mongoDB вы можете подключиться к Lambda, и в моем случае эта функция должна выглядеть следующим образом:
exports = async function(requestURL) {
const lambda = context.services.get('getTitleAtURL').lambda("us-east-1");
const result = await lambda.Invoke({
FunctionName: "getTitleAtURL",
Payload: JSON.stringify({requestURL: requestURL})
});
console.log(result.Payload.text());
return EJSON.parse(result.Payload.text());
};
Примечание: это сильно замедляет работу, хотя, как правило, это потребовалось вдвое больше времени для звонка на фини sh.