我正在尝试解决我的 Firebase 计划云功能的问题,Firebase 支持建议我检查
如果有问题的功能保持持久连接
我在这里参考文档,但示例是 HTTPS 函数,即具有req
、res
参数。我正在处理的功能是预定功能,即:
functions.pubsub.schedule('every 5 minutes').onRun((context) => {//some work})
没有req
和res
参数,如何检查firebase调度云功能是否保持持久连接?
编辑:
我收到了 Firebase 支持的回复,他们建议我检查从我的预定函数发出的 HTTP 请求的持久连接。
我的计划函数通过抓取 pdf URL 执行网络抓取任务,然后从这些 pdf 文档中提取纯文本。我面临的问题是这些任务总是因我无法捕捉到的“Bad end offset”错误而崩溃。pdfjs
Firebase 支持怀疑在访问 pdf 的 URL时连接不是持久的。
Error: Bad end offset: 1376305
at ChunkedStream.onReceiveData (/workspace/node_modules/pdfjs-dist/es5/build/pdf.worker.js:12255:15)
at ChunkedStreamManager.onReceiveData (/workspace/node_modules/pdfjs-dist/es5/build/pdf.worker.js:12818:21)
at /workspace/node_modules/pdfjs-dist/es5/build/pdf.worker.js:12602:15
at process._tickCallback (internal/process/next_tick.js:68:7)
代码:
const pdf = require('../pdf/pdf')
function getTextByUrl() {
let url = "https://www.nea.gov.sg/docs/default-source/our-services/amendments-to-copeh-for-the-removal-of-roof-gutters-for-a-amp-a-or-reconstruction-works-involving-roof-structures.pdf"
let options = pdf.setupPdfOptions(url)
return extract(options)
}
function extract(options) {
return pdf.getPlainBody(options)
.then(pb => {
console.log("Text extraction done:", pb)
})
.catch(err => {
console.log("Err:", err)
})
}
在 pdf.js 脚本中:
const pdfjslib = require('pdfjs-dist/es5/build/pdf.js');
function getPlainBody(options) {
console.log("1")
return getDocument(options)
.then(doc => {
console.log("4")
return extractTexts(doc, doc.numPages)
})
.catch(err => console.log('Get plainBody err:', err))
}
function getDocument(options) {
console.log("2")
var loadingTask = pdfjslib.getDocument(options)
return loadingTask.promise
.then((doc) => {
console.log("3") //<== Not logged and crashed
return doc
})
.catch(err => console.log("getDocument err:", err)) //<== Didn't catch the "Bad end offset" error
}
function extractTexts(doc, maxNumPages) {
var promises = []
for (pageNum = 1; pageNum <= maxNumPages; pageNum++) {
const promise = getText(pageNum, doc)
promises.push(promise)
}
return Promise.all(promises)
.then((results) => {
var pdfString = []
for (const result of results) {
pdfString.push(result);
}
return pdfString.join('').replace(/\s{2,}/g,' ').trim();
})
.catch((err) => {
console.log('Error extracting text', err)
})
}
function getText(pageNum, doc) {
console.log("5")
return doc.getPage(pageNum)
.then((page) => {
return page.getTextContent()
})
.then((content) => {
var strings = content.items.map((item) => {
return item.str
});
const concatStrings = strings.join('');
return concatStrings;
})
.catch((err) => {
console.log('Error getting text', err)
return
})
}
function setupPdfOptions(url) {
return {
url: url,
httpHeaders: {
"User-Agent": //My useragent,
},
};
}
我试图在agent = new http.Agent({keepAlive: true});
atsetupPdfOptions
但它仍然崩溃。
我可以做些什么来保持pdfjs
与 pdf 的 URL 之间的持久连接?
我正在运行节点引擎 10,并且"pdfjs-dist": "^2.4.456"
.