Отправить запрос Firebase Облачные функции Тайм-аут - PullRequest
0 голосов
/ 10 октября 2018

Я знаю, что каждая функция HTTP должна заканчиваться end () или send (), поэтому я думаю, что это может быть связано с моей проблемой.Я создаю приложение Shopify, которое я хочу разместить на Firebase.Я получил его для аутентификации и установки, но когда я пытаюсь перехватить маркер постоянного доступа через POST, Firebase истекает.Этот же код отлично работает с ngrok.Вся функция маршрута ниже.

const dotenv = require('dotenv').config();
const functions = require('firebase-functions');
const express = require('express');

const app = express();
const crypto = require('crypto');
const cookie = require('cookie');
const nonce = require('nonce')();
const querystring = require('querystring');
const request = require('request-promise');

const apiKey = process.env.SHOPIFY_API_KEY;
const apiSecret = process.env.SHOPIFY_API_SECRET;
const scopes = 'read_products,read_customers';
const forwardingAddress = 'https://my-custom-app.firebaseapp.com/app';

app.get('/app/shopify/callback', (req, res) => {
  const { shop, hmac, code, state } = req.query;
  const stateCookie = cookie.parse(req.headers.cookie).__session;

  if (state !== stateCookie) {
    return res.status(403).send('Request origin cannot be verified');
  }

  if (shop && hmac && code) {
    // DONE: Validate request is from Shopify
    const map = Object.assign({}, req.query);
    delete map['signature'];
    delete map['hmac'];
    const message = querystring.stringify(map);

  const generatedHash = crypto
    .createHmac('sha256', apiSecret)
    .update(message)
    .digest('hex');

  if (generatedHash !== hmac) {
    return res.status(400).send('HMAC validation failed');
  }


  // Collect permanent access token
  const accessTokenRequestUrl = 'https://' + shop + '/admin/oauth/access_token';
  const accessTokenPayload = {
    client_id: apiKey,
    client_secret: apiSecret,
    code,
  };

  // Everything works up until here

  request.post(accessTokenRequestUrl, { json: accessTokenPayload })
    .then((accessTokenResponse) => {
        const accessToken = accessTokenResponse.access_token;

        // If below is uncommented, it will not show on browser, Firebase seems to timeout on the above request.post.
        //res.status(200).send("Got an access token, let's do something with it");

        // Use access token to make API call to 'shop' endpoint
        const shopRequestUrl = 'https://' + shop + '/admin/shop.json';
        const shopRequestHeaders = {
            'X-Shopify-Access-Token': accessToken,
        };

        request.get(shopRequestUrl, { headers: shopRequestHeaders })
            .then((shopResponse) => {
                res.end(shopResponse);
            })
            .catch((error) => {
                res.status(error.statusCode).send(error.error.error_description);
            });

    })
        .catch((error) => {
            res.status(error.statusCode).send(error.error.error_description);
        });
  } else {
res.status(400).send('Required parameters missing');
  }
});

exports.shopifyValidate = functions.https.onRequest(app);

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы вызываете response.end () неправильно:

    request.get(shopRequestUrl, { headers: shopRequestHeaders })
        .then((shopResponse) => {
            res.end(shopResponse);
        })

Как видно из связанной документации, end () не принимает параметр.Это просто заканчивает ответ.Возможно, вы захотите вызывать send (), если у вас есть данные для отправки.

Если вы не уверены в том, как выполняется ваша функция, также используйте console.log(), чтобы регистрировать сообщения, чтобы точно определить, что она делает.Это редко хорошая идея, чтобы просто надеяться, что куча кода просто работает - вы должны убедиться, что он работает так, как вы ожидаете.

0 голосов
/ 22 октября 2018

решаемая.Оказывается, вам нужен платный план (Blaze, платите, как хотите) для доступа к внешним API.Я обновился, и это решило проблему.

0 голосов
/ 10 октября 2018

Какой модуль запроса вы используете для request.post() Пожалуйста, смотрите: https://www.npmjs.com/package/request#promises--asyncawait

Я надеюсь, что вы используете модуль https://github.com/request/request-promise вместо запроса.

...