MEAN.js 社交共享?

2024-02-24

因此,我使用 MEAN.js 构建了一个应用程序,并对文章(博客)部分进行了一些更新,以实现更好的 SEO、可读性、设计等。不过,我似乎无法弄清楚的一个问题是如何共享使用 Facebook、Google+、Twitter 等的文章,并让它们使用元标记填充正确的数据。

我想要的是

我想要的只是能够从我的 MEAN.js 应用程序共享文章(博客文章),并在我在社交网站(例如 Facebook)中发布链接时显示文章内容。

我已经尝试过的

我尝试过专门为博客文章创建一个单独的服务器布局,但这破坏了许多其他事情,以至于我意识到大量的工作可能不值得 - 必须有一种更聪明的方法。

我还尝试在客户端使用 Angular 更新 og 元标记数据,但在社交网站获取这些标记之前这些值不得更新……换句话说,它实际上并没有执行我想要的操作。

我尝试在索引渲染时获取 Angular 路由 URL,以便我可以在渲染索引之前更新这些 og 元值,但我无法在索引中的任何位置找到这些值req data.

我认为问题是什么

从概念上讲,我认为这是正在发生的事情:

  1. 该请求到达我的服务器,但由于它是使用 Angular 路由的单页面应用程序,req.url值只是根页面(“/”)。

  2. 索引文件被加载,它使用标准服务器模板布局。

  3. Angular 被加载并进行 AJAX 调用以获取文章数据,然后将该数据绑定到页面上的变量。

所以基本上,在 Angular 弄清楚要抓取哪些文章信息之前,布局就已经被渲染了(使用 og 元值)。

我猜理想的解决方案是什么

In my express.js文件中,应用程序的局部变量设置如下:

// Setting application local variables
app.locals.siteName = config.app.siteName;
app.locals.title = config.app.title;
app.locals.description = config.app.description;
app.locals.keywords = config.app.keywords;
app.locals.imageUrl = config.app.imageUrl;
app.locals.facebookAppId = config.facebook.clientID;
app.locals.jsFiles = config.getJavaScriptAssets();
app.locals.cssFiles = config.getCSSAssets();

然后,这些局部变量由 Swig 在layout.server.view.html文件如下:

// Note the {{keywords}}, {{description}}, etc. values. 
<!-- Semantic META -->
<meta id="keywords" name="keywords" content="{{keywords}}">
<meta id="desc" name="description" content="{{description}}">

<!-- Facebook META -->
<meta id="fb-app-id" property="fb:app_id" content="{{facebookAppId}}">
<meta id="fb-site-name" property="og:site_name" content="{{siteName}}">
<meta id="fb-title" property="og:title" content="{{title}}">
<meta id="fb-description" property="og:description" content="{{description}}">
<meta id="fb-url" property="og:url" content="{{url}}">
<meta id="fb-image" property="og:image" content="{{imageUrl}}">
<meta id="fb-type" property="og:type" content="website">

<!-- Twitter META -->
<meta id="twitter-title" name="twitter:title" content="{{title}}">
<meta id="twitter-description" name="twitter:description" content="{{description}}">
<meta id="twitter-url" name="twitter:url" content="{{url}}">
<meta id="twitter-image" name="twitter:image" content="{{imageUrl}}">

因此,理想情况下,我认为我们希望在渲染页面之前使用文章特定信息更新这些值。问题是,如果布局在 Angular 弄清楚要填充哪些文章数据之前就已渲染,我该怎么做?同样,Angular 路线似乎在任何地方都不可用req对象,所以我完全不知道如何做到这一点。

所以我回到了我最初的愿望 - 如何使用 MEAN.js 以“漂亮”的方式在社交媒体上分享我的文章?我走在正确的轨道上吗?当前的文章设置是否可行?我是否需要构建一个完全不使用 Angular 的完整博客模块?


我终于在没有 Nginx 或 MEANJS 框架之外的任何其他东西的情况下为我的应用程序工作了。你的里程可能会有所不同,但我想无论如何我都会分享结果。它对我有用,但可能不适合你。

基本上我已经设置了一种获取非哈希 URL 并重定向到哈希 URL 的方法。因此用户可以分享他们的个人资料,例如example.com/myprofile它会重定向到example.com/#!/profile/myprofile.

然后,我严格为社交机器人创建了一个单独的布局(尽管回想起来,我不确定这是否完全必要),并在网站被抓取时提供单独的布局。我这样做是这样的:

社交布局.server.view.html

...some stuff here...
//Note the variable names, e.g. {{siteName}}
<meta id="fb-app-id" property="fb:app_id" content="{{facebookAppId}}">
<meta id="fb-site-name" property="og:site_name" content="{{siteName}}">
<meta id="fb-title" property="og:title" content="{{socialTitle}}">
<meta id="fb-description" property="og:description" content="{{socialDescription}}">
<meta id="fb-url" property="og:url" content="{{socialUrl}}">
<meta id="fb-image" property="og:image" content="{{socialImageUrl}}">
<meta id="fb-type" property="og:type" content="website">

...other stuff here...

然后在我的 Express 文件中,我明确检查user-agents以确定是否需要新的布局。如果我找到一个机器人,我会从数据库中获取一些与 URL 相关的关键数据,然后填充变量,如下所示:

快递.js

// This code happens just after app.locals variables are set.
    // Passing the request url to environment locals
    app.use(function(req, res, next) {
        // Let's check user-agents to see if this is a social bot. If so, let's serve a different layout to populate the og data so it looks pretty when sharing.
        if(req.headers['user-agent'] === 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)' ||
            req.headers['user-agent'] === 'facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)' ||
            req.headers['user-agent'] === 'facebookexternalhit/1.1 (+https://www.facebook.com/externalhit_uatext.php)' ||
            req.headers['user-agent'] === 'facebookexternalhit/1.0 (+https://www.facebook.com/externalhit_uatext.php)' ||
            req.headers['user-agent'] === 'visionutils/0.2' ||
            req.headers['user-agent'] === 'Twitterbot/1.0' ||
            req.headers['user-agent'] === 'LinkedInBot/1.0 (compatible; Mozilla/5.0; Jakarta Commons-HttpClient/3.1 +http://www.linkedin.com)' ||
            req.headers['user-agent'] === 'Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20110814 Firefox/6.0 Google (+https://developers.google.com/+/web/snippet/)' ||
            req.headers['user-agent'] === 'Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)') {

            var urlAttempt = req.url;
            urlAttempt = urlAttempt.substr(1);

            Users.findOne({ link: urlAttempt }, function(err, results) {
                if(err) {
                    res.locals.url = req.protocol + '://' + req.headers.host;
                    next();
                } else if (results !== null) {
                    // Found link. Populate data.
                    res.status(200).render('social-index', {

                        // Now we update layout variables with DB info.
                        socialUrl: req.protocol + '://' + req.headers.host + req.url,
                        socialTitle: results.orgName,
                        socialDescription: results.shortDesc,
                        socialImageUrl: req.protocol + '://' + req.headers.host + '/profile/img/' + results.imgName
                    });
                } else {
                    res.locals.url = req.protocol + '://' + req.headers.host;
                    next();
                }
            });
        } else {
            res.locals.url = req.protocol + '://' + req.headers.host;
            next();
        }
    });

同样,您的里程可能会有所不同,但这对我有用(部分)。我仍在致力于社交共享整个 URL(包括哈希值)。希望它能以某种方式有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MEAN.js 社交共享? 的相关文章

  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 如何在 AngularJS 循环内使用标签

    所以我在里面ng repeat像这样 li li

随机推荐

  • 当我使用“pip install mysql-connector”时,“无法找到 Protobuf include 目录”

    当我尝试使用 pip install mysql connector 加载时出现此错误 我也尝试过 pip install Protobuf 但没有解决方案 Python architecture 64 bit Python ARCH 64
  • React-native:node_modules\@react-native-community\masked-view 中缺少 index.js 文件

    我在构建反应本机应用程序时收到以下错误 react native community masked view and react navigation stack是最新的 但不确定为什么在构建时没有解决这个包 error Error Whi
  • 如何使用 matplotlib/python 绘制 ROC 曲线 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想绘制一条 ROC 曲线python with matplotlib并想像这样展示它 假设我们有 0 0 到 1 0 的预测y sc
  • 静态存储持续时间初始化

    在 C 中 静态存储持续时间对象以未指定的顺序初始化 同一编译单元中的除外 代码如下 include
  • jQuery Mobile 谷歌通用分析

    我很高兴使用这个最佳实践http roughlybrilliant com jquery mobile best practices 7 http roughlybrilliant com jquery mobile best practi
  • 定时器中断是否独立于系统处于内核模式还是用户模式?

    在Linux单处理器系统中 定时器中断是否与系统处于内核模式还是用户模式无关 当系统处于内核模式时 定时器中断有什么不同的行为吗 简单的答案是 硬件时钟中断服务例程的执行和动态定时器处理程序的调度都不受硬件时钟中断之前系统所处模式的影响 原
  • 如何观察服务类中的实时数据

    我想将从 API 获得的一些记录插入到我的数据库中 我正在使用服务类来执行此过程 我试图在服务类中使用实时数据的概念 但它要求我的服务类是生命周期所有者 我一直在思考如何让我的服务类观察者实时数据的变化 任何帮助都会很好 如果您的服务不应受
  • Haskell 中类似 OO 的接口实现

    尽管有这个标题 我不会仅仅询问 OO 世界和 Haskell 之间的翻译 但我想不出更好的标题 此讨论类似于但不等于this one https stackoverflow com questions 5474171 oo interfac
  • 按位运算如何提高 Asm.js 的性能?

    在 Asm js 定义的第一行有一个基于 Asm js 的代码示例 它解释了按位运算有助于获得更快的 JS 代码 HEAP32 p gt gt 2 0 or x y 0 我的问题是 这个操作如何提高性能 在 Asm js 或 Emscrip
  • Drools 知识库 已弃用

    我正在将 Drools 规则引擎集成到我的应用程序中 我发现的 99 的入门示例如下 KnowledgeBuilder kbuilder KnowledgeBuilderFactory newKnowledgeBuilder kbuilde
  • 如何验证 WTForms 中的日期字段

    在我的 Flask 应用程序中 我有一个 WTForm 其中有两个日期选择器 分别用于 开始日期 和 结束日期 验证 结束日期 不早于 开始日期 的最佳方法是什么 from flask wtf import FlaskForm from w
  • .NET 自定义事件组织帮助

    作为 C 的新手 我最近一直在研究自定义事件 虽然我认为我现在了解设置自定义事件所需的基本部分 但我无法确定where每件作品都属于 具体来说 这就是我正在尝试做的事情 我有一个表示内部数据结构布局的树控件 当数据在树中重新排列 通过拖放
  • 傅立叶级数数据与 numpy 的拟合:fft 与编码

    假设我有一些数据 y 我想对其进行傅立叶级数拟合 对此post https stackoverflow com questions 4258106 how to calculate a fourier series in numpy 解决方
  • HttpClient 不从 CookieContainer 发送 cookie

    我正在使用 Visual Studio 2012 开发带有 WPF NET 4 0 客户端的 ASP WebAPI ASP MVC 4 应用程序 客户端需要登录到服务器 我使用带有身份验证 cookie 的 FormsAuthenticat
  • MS Access 子表单在表单视图中带有#Error 字段

    微软访问 2003 我在子表单后面有一个查询 其中有如下 sql 语句 SELECT ClientTotalInvoiceLineItems CDate GetWeekEnding WeekEnding1 WeekEnding2 WeekE
  • 使用内容配置作为文件名下载 Node.js 文件

    我正在使用 Request 模块下载文件 但是当文件名必须来自 Content Disposition 标头时 我不太确定如何将响应传输到输出流 所以基本上 我需要读取响应直到找到标头 然后将其余部分通过管道传输到该文件名 这些示例显示如下
  • 检查残差并可视化零膨胀泊松 r

    我正在为 CPUE 数据运行零膨胀模型 该数据有零通货膨胀的证据 我已通过 Vuong 测试 在下面的代码中 确认了这一点 根据 AIC 的说法 完整模型 zint 优于零模型 我现在想要 检查完整模型的残差以确定模型拟合 由于缺乏来自同事
  • Javascript 设置按钮处于活动状态

    我有一个按钮表 一旦填充完毕 我就会使用 document getElementById btn0 click 单击第一个按钮 该按钮正在执行其应该执行的操作 但是按钮的背景颜色并没有像我手动单击它时那样改变 正如您所看到的 当它运行时 d
  • Rails 这个查询是否对 sql 注入开放?

    我仍在学习如何使用 ActiveRecord 编写良好的查询 我很好奇这个查询是否会受到 sql 注入的影响 因为我在查询中使用日期字段的方式 有人可以指出任何明显的错误或任何更好的方法来编写这个查询吗 arrangements for m
  • MEAN.js 社交共享?

    因此 我使用 MEAN js 构建了一个应用程序 并对文章 博客 部分进行了一些更新 以实现更好的 SEO 可读性 设计等 不过 我似乎无法弄清楚的一个问题是如何共享使用 Facebook Google Twitter 等的文章 并让它们使