Firebase 计划功能 subpub axios POST 请求

如果

我正在使用 firebase 函数从 firebase pubsub 命名空间安排 puppeteer 任务。

我还想使用 axios 将响应发布回 google 外部的 API 端点。

我直接从工作人员那里尝试了 Axios,但出现 500 错误。

我的目标:

  1. 使用 firebase schedule 和 pubsub 命名空间生成 puppeteer 作业 - 完成
  2. 使用 axios 将结果发布回外部端点 - 需要您的帮助 :)

代码:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const puppeteer = require('puppeteer');
const url = require('url');
// Request Data From A URL
var axios = require('axios');
var https = require('https');
// var cors = require("cors");
// Initalise App
admin.initializeApp();
const db = admin.firestore();

const workers = {
    extract: async ({ uri, post_id, store_id, domain }) => {
        let theTitle = null;
        let thePrice = null;
        let host = url.parse(uri).host;
        let postId = post_id;
        let storeId = store_id;
        let theDomain = domain;

        const SELECTORS = {
          amazonPrice: '#priceblock_ourprice',
          ebayPrice: '#prcIsum',

        const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });
        console.log('spawning chrome headless');
        console.log(postId);
        console.log(storeId);
        console.log(domain);
        const page = await browser.newPage();
        // Goto page and then do stuff
        console.log('going to ', uri);
        await page.goto(uri, {
            waitUntil: ["domcontentloaded", "networkidle0"]
        });
        console.log('waiting for page to load ');
        console.log(host);
        // theTitle = await page.title();
        try {

          theTitle = await page.title();


          // find amazon price
          if (host === 'www.amazon.co.uk' || 'amazon.co.uk') {
            const priceInput = await page.$(SELECTORS.amazonPrice)
            thePrice = await page.evaluate(element => element.textContent, priceInput)
          }
          // find ebay price
          if (host === 'www.ebay.co.uk' || 'ebay.co.uk') {
            const priceInput = await page.$(SELECTORS.ebayPrice)
            thePrice = await page.evaluate(element => element.value, priceInput)
          }

          else {
            console.log('failed scrape at', host);
          }

        }
        catch (error) {
            console.error('There was an error processing the page:', error);
        }
        finally {
            // close browser
            if (browser !== null) {
                await browser.close();
            }
        }
        console.log(theTitle);
        console.log(thePrice);
        const response = {
            title: theTitle,
            price: thePrice,
        };


        console.log('post' + postId + storeId + thePrice + theDomain);

        axios.post('endpoint', {
            price: thePrice,
            store_id: storeId,
            post_id: postId,
            domain: theDomain,
          },
          {
            headers: {
                'Content-Type': 'multipart/form-data',
            }
          })
          .then(function (response) {
            console.log(response);
          })
          .catch(function (error) {
            console.log(error);
          });


        // axios post end

        return response;
    }
};
exports.taskRunner = functions.runWith({ memory: '2GB' }).pubsub
    // export const taskRunner = functions.region('europe-west2').runWith( { memory: '2GB' }).pubsub
    .schedule('*/15 * * * *').onRun(async (context) => {
    // Consistent timestamp
    const now = admin.firestore.Timestamp.now();
    // Query all documents ready to perform
    const query = db.collection('tasks').where('performAt', '<=', now).where('status', '==', 'scheduled');
    const tasks = await query.get();
    // Jobs to execute concurrently.
    const jobs = [];
    // Loop over documents and push job.
    tasks.forEach(snapshot => {
        const { worker, options } = snapshot.data();
        const job = workers[worker](options)
            // Update doc with status on success or error
            // .then(() => snapshot.ref.update({ status: 'complete' }))
            .catch((err) => snapshot.ref.update({ status: 'error' }));
        jobs.push(job);
    });
    // Execute all jobs concurrently
    return await Promise.all(jobs);
});

错误

Error: Request failed with status code 500
    at createError (/srv/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/srv/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/srv/node_modules/axios/lib/adapters/http.js:236:11)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  config: 
   { url: 'endpoint',
     method: 'post',
     data: '{"£59.99":null,"store_id":32,"post_id":25,"domain":"amazon.co.uk"}',
     headers: 
      { Accept: 'application/json, text/plain, */*',
        'Content-Type': 'multipart/form-data',
        'User-Agent': 'axios/0.19.2',
        'Content-Length': 65 },
     transformRequest: [ [Function: transformRequest] ],
     transformResponse: [ [Function: transformResponse] ],
     timeout: 0,
     adapter: [Function: httpAdapter],
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: -1,
     validateStatus: [Function: validateStatus] },
  request: 
   ClientRequest {
     domain: 
      Domain {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        members: [Array] },
     _events: 
      { socket: [Function],
        abort: [Function],
        aborted: [Function],
        error: [Function],
        timeout: [Function],
        prefinish: [Function: requestOnPrefinish] },
     _eventsCount: 6,
     _maxListeners: undefined,
     output: [],
     outputEncodings: [],
     outputCallbacks: [],
     outputSize: 0,
     writable: true,
     _last: true,
     upgrading: false,
     chunkedEncoding: false,
     shouldKeepAlive: false,
     useChunkedEncodingByDefault: true,
     sendDate: false,
     _removedConnection: false,
     _removedContLen: false,
     _removedTE: false,
     _contentLength: null,
     _hasBody: true,
     _trailer: '',
     finished: true,
     _headerSent: true,
     socket: 
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 'SERVERNAME',
        npnProtocol: false,
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object],
        _eventsCount: 9,
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'HOST',
        _readableState: [Object],
        readable: true,
        domain: [Object],
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 259,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: [Object],
        _requestCert: true,
        _rejectUnauthorized: true,
        parser: null,
        _httpMessage: [Circular],
        [Symbol(asyncId)]: 538,
        [Symbol(bytesRead)]: 0 },
     connection: 
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 'HOST',
        npnProtocol: false,
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object],
        _eventsCount: 9,
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'HOST',
        _readableState: [Object],
        readable: true,
        domain: [Object],
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: false,
        _bytesDispatched: 259,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: [Object],
        _requestCert: true,
        _rejectUnauthorized: true,
        parser: null,
        _httpMessage: [Circular],
        [Symbol(asyncId)]: 538,
        [Symbol(bytesRead)]: 0 },
     _header: 'POST ENDPOINT HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nContent-Type: multipart/form-data\r\nUser-Agent: axios/0.19.2\r\nContent-Length: 65\r\nHost: HOST\r\nConnection: close\r\n\r\n',
     _onPendingData: [Function: noopPendingOutput],
     agent: 
      Agent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 443,
        protocol: 'https:',
        options: [Object],
        requests: {},
        sockets:
 more_vert
Logs are subject to Cloud Logging's 

如果

经过一些工作和反复试验。我决定使用 Request 包来解决这个问题 - https://www.npmjs.com/package/request

没有时间调查 Axios 不工作的原因,但会进行审查,如果有启发,我会在这里发布。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章