【问题标题】:Prerender Angular app on an already existing Node.js server在现有的 Node.js 服务器上预渲染 Angular 应用程序
【发布时间】:2018-07-05 17:42:45
【问题描述】:

我的目标是拥有动态的og: 标签,Facebook 爬虫可以看到这些标签。通过做一些研究,我认为最好的(可能也是唯一的)方法是在服务器上预渲染我的应用程序。但是我在这样做时遇到了问题。

我已经有一个现有的 Node.js 服务器,它看起来与大多数在线指南中的服务器略有不同。

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();

// Api for retrieving data from DB
const api = require('./server/api');

// Parsers
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// Angular DIST folder
app.use(express.static(path.join(__dirname, 'dist')));

// Api location
app.use('/api', api);

// Send all other requests to the Angular app
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, 'dist/index.html'))
})

// Set Port
const port = process.env.PORT || '3040';
app.set('port', port);

const server = http.createServer(app)

server.listen(port, () => console.log('Magic happens on localhost:' + port));

我尝试过使用 prerender.io。我得到了一个 API 密钥,安装了 prerender-node 并在将请求重定向到 index.html 之前把它放好:

app.use(require('prerender-node').set('prerenderToken', 'my-token'));
// Send all other requests to the Angular app
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, 'dist/index.html'))
})

我还将它添加到我的 index.html 中: <meta name="fragment" content="!">

什么都没有改变。也许我还需要做其他事情才能让它工作?同样,我的目标是拥有动态的og: 标签,Facebook 爬虫可以看到这些标签。

附加信息:现在,如果重要的话,我正在使用 Angular 4 附带的 Meta 服务设置元标记。

编辑: 如果有人想测试,演示链接:http://aramet.demo.cdots.bg/news-preview/1

【问题讨论】:

  • 您有我们的测试网址吗?我想仔细看看这个问题。
  • @luschn 是的,我已将其添加到编辑中
  • 和我想的一样,那里没有 og 标签。
  • 确保你明白为什么会发生这种情况:facebook 不解析 javascript。一点也不。显然,一些角度元插件不会解决问题(因为,再一次,没有javascript)。 prerender.io 仅适用于它在没有任何 javascript 的情况下呈现 og 标记。也许这会对你有所帮助:github.com/romelgomez/single-page-application-seo
  • 这也可能对您有所帮助:scotch.io/tutorials/angularjs-seo-with-prerender-io

标签: javascript node.js angular facebook prerender


【解决方案1】:

你能不能试着移动一下:

app.use(require('prerender-node').set('prerenderToken', 'my-token'));

在静态文件行上方,如:

app.use(require('prerender-node').set('prerenderToken', 'my-token'));
// Angular DIST folder
app.use(express.static(path.join(__dirname, 'dist')));

由于您的 index.html 文件位于 dist 文件夹中,并且您从 dist 文件夹中提供静态文件,我想知道静态调用是否以某种方式为您的 index.html 文件提供服务。

【讨论】:

  • 我试过了,但没有用。准确设置元标记的方式是通过使用文章 ID 向服务器发出请求,然后它返回一个对象,元服务将元标记设置为对象的属性。我期望 prerender 服务的行为是等到所有这些都完成后,缓存 HTML 并在爬虫到来时返回 HTML。
  • 我也尝试在 prerender.io 网站的缓存页面中添加文章。当我在预览下单击“原始 html”以查看其中的内容 (prerender.io/…) 时,它在我的控制台中抛出了一个错误,提示“混合内容:'' 处的页面是通过 HTTPS 加载的,但请求了一个不安全的样式表''。此请求已被阻止;内容必须通过 HTTPS 提供。”这可能是问题的一部分。
  • 您的第一条评论正是 Prerender 的工作原理,因此我们应该按预期呈现页面。您提到的第二个问题不是问题,因为我们正在尝试通过我们的原始 html 链接显示您的原始 HTML。通过中间件提供预呈现页面时,您不会看到该错误。请随时通过 support@prerender.io 给我们发送电子邮件,我可以提供更多尝试以调试此问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2018-08-16
  • 2012-08-22
  • 2021-10-20
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多