使用 ReactJS 和 AWS Lambda 预览 Facebook 帖子

2025-06-08

使用 ReactJS 和 AWS Lambda 预览 Facebook 帖子

我目前专注于学习 React。对我来说,学习的最好方式是做一个小项目,而不是一个待办事项清单(哈哈)。

话虽如此,我还是决定构建一个小型应用程序,接收 URL、获取元标记(尤其是开放图标记)并基于 Facebook 构建预览。

为了完成这项任务,我选择了 ReactJS 和 AWS Lambda(托管在 Netlify 上)。

Lambda 函数

Lambdas 的任务非常简单。接收一个 URL,解析并获取元标签,查找 Open Graph 标签。

open -graph-scraper npm 包几乎完成了整个工作,因此这里是 lambda 的最终代码:

import ogs from "open-graph-scraper";
import getUrl from "get-urls";
import urlParser from "url";

export function handler(event, context, callback) {
  const text = event.queryStringParameters.q;
  const urls = getUrl(text);

  // Return if there is no urls in text
  if (!urls.size) {
    return callback(null, {
      statusCode: 200,
      body: JSON.stringify({
        text: text,
        meta: null,
        error: ["Empty url in text"]
      })
    });
  }

  // Retrieve first URL in text - urls are already normalized
  const url = [...urls][0];
  const options = { url };

  ogs(options, (error, results) => {
    const statusCode = results.success ? 200 : 500;
    callback(null, buildResponseObject(statusCode, results, text));
  });
}

function getUrlDomain(url) {
  const urlObj = urlParser.parse(url);
  return urlObj.host;
}

function cleanText(text) {
  return text.replace(/(?:https?|ftp):\/\/[\n\S]+/g, "");
}

function buildResponseObject(statusCode, result, text) {
  let meta = statusCode === 200 ? result.data : null;

  if (meta) {
    let images = meta.ogImage;

    if (images instanceof Array) {
      meta.ogImage = images[0];
    }

    let domain = meta.ogUrl;

    if (domain) {
      meta.ogUrl = getUrlDomain(meta.ogUrl);
    }
  }

  const body = {
    meta: meta,
    text: cleanText(text),
    error: statusCode !== 200 ? result.error : null
  };

  return {
    statusCode,
    body: JSON.stringify(body)
  };
}
Enter fullscreen mode Exit fullscreen mode

前端

正如我在文章开头提到的,我们选择使用 React 来构建客户端界面。

使用的软件包是:

  "dependencies": {
    "get-urls": "^7.2.0",
    "netlify-lambda": "^0.4.0",
    "open-graph-scraper": "^3.3.0",
    "react": "^16.4.1",
    "react-content-loader": "^3.1.2",
    "react-dom": "^16.4.1",
    "react-scripts": "1.1.4",
    "styled-components": "^3.3.2"
  },
Enter fullscreen mode Exit fullscreen mode

结果如下:

截屏

贡献

它是免费且开源的!

该代码托管在 Github 上,您可以在此处查看其运行情况

大家好,我期待你们的反馈。

谢谢

鏂囩珷鏉ユ簮锛�https://dev.to/hugodias/facebook-post-preview-with-reactjs-and-aws-lambda-38kk
PREV
HTML 幻灯片无需框架,仅需 CSS
NEXT
🌟 个人成长与学习 | 初级开发者终极生存指南 1. 多犯错 2. 用自己的话回顾所学内容 3. 参加本地聚会(和会议)