在看到MERN项目允许简单的用户身份验证、快速部署等功能之后,我正在将它移到React + MongoDB Stitch中。
然而,我有一个很难理解的时间,在哪里和如何我可以调用一个网站刮擦功能。以前,我在Express.js中使用诸如:
app.post("/api/getTitleAtURL", (req, res) => {
if (req.body.url) {
request(req.body.url, 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
};
res.send(webpage);
} else {
res.status(400).send({ message: "THIS IS AN ERROR" });
}
});
}
});但是很明显,对于Stitch来说,不需要Node & Express。是否有一种方法可以获取另一个站点的内容,而不必托管一个只为该函数服务的node.js应用程序?
谢谢
发布于 2020-04-18 19:11:03
结果表明,您可以在MongoDB Stitch 中构建允许您上传外部依赖项的函数。
但是,也有一些限制,例如,cheerio没有作为上传的外部依赖关系工作,而请求工作正常。因此,一种解决方案是在AWS中创建一个无服务器功能,然后将mongoDB针连接到AWS (mongoDB针可以连接到许多第三方服务,包括许多AWS云服务,如lambda、s3、kinesis等)。
AWS允许您上传任何外部依赖项,如果mongoDB缝合允许的话,我们将不需要lambda,但是缝合仍然需要很多支持。在我的例子中,我有一个节点函数,将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中,连接到第三方服务,选择AWS,输入使IAM用户获得的密钥。在规则->操作中,选择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());
};注:这减慢了表演的时间,虽然通常需要两次额外的时间才能完成.
https://stackoverflow.com/questions/61281411
复制相似问题