使用 angular6 和 @ng-toolkit/universal 时 og 标签的问题
Problem with og Tags, when using angular6 and @ng-toolkit/universal
我正在使用@ng-toolkit/universal 在 firebase 上创建服务器端渲染应用程序。
何时可以使用以下方法直接在 ngOnInit 中成功添加或更新 og-tags:
从“@angular/platform-browser”导入{元};
当我在 ngOnInit 中更新 og-tags 时一切正常;当我订阅路由器事件时。
但是当我想用 firebase 数据库值更新这些 og-tags 时我遇到了问题。我的代码是这样的:
ngOnInit(){
/* This part works:
1- I see 'the first step' string in the server console.
2- The og:type update works and og-tag debuger can find it.
*/
console.log('The first step');
this.meta.updateTag({ property: 'og:type', content: 'og:type.for.test' });
firebase.database().ref('test/ssr').on('value', function (snapshot) {
/* This part dose not work:
1- I can't see 'the first step' string in the server console.
But I can find this string in client side console.
2- og-tag debuger can not find 'og:title'. But I can find it updated in my browser.
*/
console.log('The Secound Step. No Working');
this.meta.updateTag({ property: 'og:title', content: 'og:title.for.test' });
});
}
我在 firebase 上部署应用程序时没有问题,代码运行良好,但似乎代码的第二部分服务于客户端而不是服务器端。
问题是什么?我该如何解决?
我找到了问题的解决方案。
解决问题:
1- 当我在我的代码中使用任何承诺时没有问题。
2- 当我使用 angularfire-lite.
时没有问题
所以有2个解决方案:
1- 使用 angularfire-lite
2- 使用 node.js 代码用于服务器端版本的应用程序。我的意思是 "server.js" 或 "server.ts" 文件。
我正在为我的 "server" 文件使用 javascript。
所以我可以向 server.js 添加一些 node.js 代码来更新 og-tags。
为此,第一步是构建 serve.js。然后找到要添加元标记的位置。然后部署。而已。
结果是这样的。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.database();
/*<<-Just for ssr*/
var SeoServiceService = /** @class */ (function () {
function SeoServiceService(titleService, meta, router) {
this.titleService = titleService;
this.meta = meta;
this.router = router;
}
SeoServiceService.prototype.generateTags = function (config) {
console.log('Client Side');
/*Just for ssr->>*/
return db.ref('test/ssr').on('value',(snapshot)=>{
console.log('Server Side');
this.meta.updateTag({ property: 'og:title', content: 'It works :)' });
return true
});
/*Just for ssr->>*/
console.log('Client Side');
};
SeoServiceService.ngInjectableDef = i0.defineInjectable({ factory: function SeoServiceService_Factory() { return new SeoServiceService(i0.inject(i1.Title), i0.inject(i1.Meta), i0.inject(i2.Router)); }, token: SeoServiceService, providedIn: "root" });
return SeoServiceService;
}());
"Server.js" 是一个大而复杂的文件。很难找到应该在哪里添加 node.js 代码。一种解决方案是将您的 node.js 作为注释添加到 angular 代码中。构建 'server.js' 后,只需找到此评论并使其可运行即可。
例如,我的 angular 代码如下。最后的结果如上代码
import { Injectable } from '@angular/core';
import { Title, Meta } from '@angular/platform-browser';
import { Router } from '@angular/router';
/*Just for ssr->>*/
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.database();
/*<<-Just for ssr*/
@Injectable({
providedIn: 'root'
})
export class SeoServiceService {
constructor(
private titleService: Title,
private meta: Meta,
private router: Router,
) { }
generateTags(config) {
console.log('Client Side');
/*Just for ssr->>
return db.ref('test/ssr').on('value',(snapshot)=>{
console.log('Server Side');
this.meta.updateTag({ property: 'og:title', content: 'It works :)' });
return true
});
Just for ssr->>*/
console.log('Client Side');
}
}
我正在使用@ng-toolkit/universal 在 firebase 上创建服务器端渲染应用程序。
何时可以使用以下方法直接在 ngOnInit 中成功添加或更新 og-tags: 从“@angular/platform-browser”导入{元};
当我在 ngOnInit 中更新 og-tags 时一切正常;当我订阅路由器事件时。
但是当我想用 firebase 数据库值更新这些 og-tags 时我遇到了问题。我的代码是这样的:
ngOnInit(){
/* This part works:
1- I see 'the first step' string in the server console.
2- The og:type update works and og-tag debuger can find it.
*/
console.log('The first step');
this.meta.updateTag({ property: 'og:type', content: 'og:type.for.test' });
firebase.database().ref('test/ssr').on('value', function (snapshot) {
/* This part dose not work:
1- I can't see 'the first step' string in the server console.
But I can find this string in client side console.
2- og-tag debuger can not find 'og:title'. But I can find it updated in my browser.
*/
console.log('The Secound Step. No Working');
this.meta.updateTag({ property: 'og:title', content: 'og:title.for.test' });
});
}
我在 firebase 上部署应用程序时没有问题,代码运行良好,但似乎代码的第二部分服务于客户端而不是服务器端。
问题是什么?我该如何解决?
我找到了问题的解决方案。
解决问题:
1- 当我在我的代码中使用任何承诺时没有问题。 2- 当我使用 angularfire-lite.
时没有问题所以有2个解决方案: 1- 使用 angularfire-lite
2- 使用 node.js 代码用于服务器端版本的应用程序。我的意思是 "server.js" 或 "server.ts" 文件。
我正在为我的 "server" 文件使用 javascript。 所以我可以向 server.js 添加一些 node.js 代码来更新 og-tags。 为此,第一步是构建 serve.js。然后找到要添加元标记的位置。然后部署。而已。 结果是这样的。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.database();
/*<<-Just for ssr*/
var SeoServiceService = /** @class */ (function () {
function SeoServiceService(titleService, meta, router) {
this.titleService = titleService;
this.meta = meta;
this.router = router;
}
SeoServiceService.prototype.generateTags = function (config) {
console.log('Client Side');
/*Just for ssr->>*/
return db.ref('test/ssr').on('value',(snapshot)=>{
console.log('Server Side');
this.meta.updateTag({ property: 'og:title', content: 'It works :)' });
return true
});
/*Just for ssr->>*/
console.log('Client Side');
};
SeoServiceService.ngInjectableDef = i0.defineInjectable({ factory: function SeoServiceService_Factory() { return new SeoServiceService(i0.inject(i1.Title), i0.inject(i1.Meta), i0.inject(i2.Router)); }, token: SeoServiceService, providedIn: "root" });
return SeoServiceService;
}());
"Server.js" 是一个大而复杂的文件。很难找到应该在哪里添加 node.js 代码。一种解决方案是将您的 node.js 作为注释添加到 angular 代码中。构建 'server.js' 后,只需找到此评论并使其可运行即可。 例如,我的 angular 代码如下。最后的结果如上代码
import { Injectable } from '@angular/core';
import { Title, Meta } from '@angular/platform-browser';
import { Router } from '@angular/router';
/*Just for ssr->>*/
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.database();
/*<<-Just for ssr*/
@Injectable({
providedIn: 'root'
})
export class SeoServiceService {
constructor(
private titleService: Title,
private meta: Meta,
private router: Router,
) { }
generateTags(config) {
console.log('Client Side');
/*Just for ssr->>
return db.ref('test/ssr').on('value',(snapshot)=>{
console.log('Server Side');
this.meta.updateTag({ property: 'og:title', content: 'It works :)' });
return true
});
Just for ssr->>*/
console.log('Client Side');
} }