Как использовать koa.js + next в Firebase Functions - PullRequest
3 голосов
/ 02 июня 2019

Я хочу использовать облачные функции для Firebase для развертывания приложения React для приложения shopify.

Я новичок в следующих и Коа.

На основании этого репо приведенный ниже код показывает, как разместить простое приложение реакции в Firebase.

const path = require('path')
const functions = require('firebase-functions')
const next = require('next')

var dev = process.env.NODE_ENV !== 'production'
var app = next({
  dev,
  conf: { distDir: `${path.relative(process.cwd(), __dirname)}/next` }
})
var handle = app.getRequestHandler()

exports.next = functions.https.onRequest((req, res) => {
  console.log('File: ' + req.originalUrl) // log the page.js file that is being requested
  return app.prepare().then(() => handle(req, res))
})

, который работает правильно, без проблем.

Затем на основе этого урока из shopify Мне нужно интегрировать koa и другие зависимости в server.js, которые, как я полагаю, должны быть размещены внутри функции firebase. так я дохожу до этого кода

const path = require('path')
const isomorphicFetch = require('isomorphic-fetch');
const Koa = require('koa');
const functions = require('firebase-functions')
const next = require('next');
const ShopifyConfig = require('./shopify.js');

const { default: createShopifyAuth } = require('@shopify/koa-shopify-auth');
const dotenv = require('dotenv');
const { verifyRequest } = require('@shopify/koa-shopify-auth');
const session = require('koa-session');

dotenv.config();

const port = parseInt(process.env.PORT, 10) || 3000;

var dev = process.env.NODE_ENV !== 'production'
var app = next({
  dev,
  conf: { distDir: `${path.relative(process.cwd(), __dirname)}/next` }
})
var handle = app.getRequestHandler()

const server = new Koa();

server.use(session(server));
server.keys = [ShopifyConfig.secretKey];

server.use(
  createShopifyAuth({
    apiKey: ShopifyConfig.key,
    secret: ShopifyConfig.secretKey,
    scopes: [],
    afterAuth(ctx) {
      const { shop, accessToken } = ctx.session;
      ctx.redirect('/');
    },
  }),
);

server.use(verifyRequest());

server.use(async (ctx) => {
  await handle(ctx.req, ctx.res);
  ctx.respond = false;
  ctx.res.statusCode = 200;

});

exports.next = functions.https.onRequest((req, res) => {
  console.log('File: ' + req.originalUrl) // 

  // This is old code
  // return app.prepare().then(() => {
  //   handle(req, res);
  // })

  // I tried this #1
  // server.callback(req, res);
})

// I tried this #2
// exports.next = functions.https.onRequest(server.callback);

// I tried this #3
// exports.next = functions.https.onRequest(server.callback());

// I tried this #4
exports.next = functions.https.onRequest((req, res) => {
  console.log('File: ' + req.originalUrl) 

  return app.prepare().then(() => {
    server.callback(req, res);
    //handle(req, res);
  })
})

Мой вопрос теперь основан на Коа, какой код должен быть в functions.https.onRequest? обратите внимание, что нет кода для прослушивания порта, так как он не имеет смысла для функций firebase.

Я пробовал # 1, # 2, # 3, а также этот пост

1 -> Я получаю тайм-аут запроса

2 -> Я получаю тайм-аут запроса

3 -> Я получаю сообщение «Не удается получить доступ к промежуточному программному обеспечению неопределенного» * ​​1030 *

4 -> Я получаю тайм-аут запроса

1 Ответ

0 голосов
/ 23 июня 2019

Благодаря kvindasAB

server.callback - это не обратный вызов сам по себе, а функция, которая генерирует обратный вызов из вашей конфигурации, я предположил.

, поэтому код необходимо изменить на

server.callback()(req, res);
...