【发布时间】:2015-06-02 19:43:49
【问题描述】:
所以我使用 MEAN.js 构建了一个应用程序,我对文章(博客)部分进行了一些更新,以获得更好的 SEO、可读性、设计等。不过,我似乎无法弄清楚的一个问题是如何使用 Facebook、Google+、Twitter 等分享文章,并让他们使用 og 元标记填充正确的数据。
我想要什么
我想要的只是能够从我的 MEAN.js 应用程序共享文章(博客文章),并在我将链接发布到社交网站(例如 Facebook)时显示文章内容。
我已经尝试过什么
我已经尝试为博客文章创建一个单独的服务器布局,但这会破坏很多其他的东西,我意识到工作量可能不值得 - 必须有一个更聪明的方法。
我也尝试在客户端使用 Angular 更新 og 元标记数据,但这些值不能在社交网站获取这些标记之前更新……换句话说,它实际上并没有达到我想要的效果到。
我尝试在呈现索引时获取 Angular 路由 URL,以便在呈现索引之前更新这些 og 元值,但我无法在 req 数据中的任何位置找到这些值。
我认为问题是什么
从概念上讲,这就是我认为正在发生的事情:
请求到达我的服务器,但由于它是使用 Angular 路由的单页面应用程序,
req.url值只是根页面 ('/')。加载索引文件,该文件使用标准服务器模板布局。
Angular 被加载并进行 AJAX 调用以获取文章数据,然后将该数据绑定到页面上的变量。
所以基本上在 Angular 确定要抓取的文章信息之前,布局已经被渲染(使用 og 元值)。
我猜理想的解决方案是什么
在我的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 的完整博客模块?
【问题讨论】:
标签: javascript angularjs express mean meanjs