【发布时间】:2018-04-04 08:21:40
【问题描述】:
问题的根源:我不能使用 Javascript,因为 Firebase Functions Node.Js 版本还不支持 Async/Await。所以我把它放在 Typescript 中,现在正在尝试转换为 commonJs。
那我做。
tsc -p config.json,然后产生这些错误。
../../../node_modules/firebase-functions/lib/providers/auth.d.ts(5,22): error TS2420: Class 'UserRecordMetadata' incorrectly implements interface 'UserMetadata'.
Property 'lastSignedInAt' is missing in type 'UserRecordMetadata'.
../../../node_modules/firebase-functions/lib/providers/firestore.d.ts(17,19): error TS2694: Namespace 'admin' has no exported member 'firestore'.
此外,使用 Firebase Serve -only-functions 使用 Vanilla Js 工作正常,只是在 Deploy 上开始失败,另一件事是,当使用 node getTags.js 运行 vanilla 脚本时,运行没有问题。
所以估计这可能是我的 tsconfig?请帮忙。
TSCONFIG.JSON
{
"compilerOptions": {
"lib": [
"es6",
"dom"
],
"module": "commonjs",
"noImplicitReturns": true,
"outDir": "lib",
"target": "es6"
},
"files": [
"getTags.ts"
]
}
打字稿。
import puppeteer from 'puppeteer';
import * as functions from 'firebase-functions'
function getTitle() {
const ogSelector: any = document.querySelector('meta[property="og:title"]');
if (ogSelector) {
return ogSelector.content;
}
const imgSelector: any = document.querySelector('[itemprop="name"]');
if (imgSelector) {
return imgSelector.text;
}
if (document.querySelector('title')) {
return document.querySelector('title').text;
}
return window.location.href; // Print URL as a fallback
}
function getDescription() {
const ogDesc: any = document.querySelector('meta[property="og:description"]');
if (ogDesc) {
return ogDesc.content;
}
const descSelector: any = document.querySelector('[itemprop="description"]');
if (descSelector) {
return descSelector.text;
}
const nameDescSelector: any = document.querySelector('meta[name="description"]');
if (nameDescSelector) {
return nameDescSelector.content;
}
return document.body.innerText.substring(0, 180) + '...';
}
function getImage() {
const ogImgSelector: any = document.querySelector('meta[property="og:image"]');
if (ogImgSelector) {
return ogImgSelector.content;
}
const imgTagSelector: any = document.querySelector('[itemprop="image"]');
if (imgTagSelector) {
return imgTagSelector.text;
}
return null;
}
exports.getTags = functions.https.onRequest((req, res) => {
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://itunes.apple.com/za/album/my-dear-melancholy/1363309866?app=music&ign-itsct=1363309866-1363309866&ign-itscg=0176&ign-mpt=uo%3D4');
const title = await page.evaluate(getTitle);
const description = await page.evaluate(getDescription);
const image = await page.evaluate(getImage) || await page.screenshot({ path: 'temp.png' });
browser.close();
const tags = {
title,
description,
image,
};
console.log("Tags " + JSON.stringify(tags));
res.send("Done Tags :: " + tags);
})();
});
【问题讨论】:
-
不是一个解决方案,但为什么
: any有这么多变量?那时你最好不要使用打字稿 -
众所周知,Puppeteer 不适用于 Cloud Functions。 stackoverflow.com/questions/48667933/…
-
@DougStevenson,好吧,这对 Firebase 来说完全令人失望,无论如何我仍然可以通过另一种方式在云功能上获取元标记?支持的东西?
标签: javascript typescript firebase google-cloud-functions puppeteer