Discourse API 및 Firebase(Cloud Functions)를 이용한 게시글 작성

여러분 안녕하세요!

해석하기 어려운 이상한 문제들을 겪고 있습니다. Discourse API를 사용하여 사용자가 로그인 없이 게시물을 게시할 수 있도록 하고 있습니다. 보안상의 이유로 이 코드는 서버 환경에서 실행할 예정이며, 선택한 환경은 Node.js 기반의 Firebase Cloud Functions입니다.

전체 코드는 다음과 같습니다:

const functions = require("firebase-functions");
const fetch = require('node-fetch');
const cors = require("cors")({ origin: true });

exports.makeDiscoursePost = functions.https.onRequest((request, response) => {
  cors(request, response, () => {
    let myHeaders = new Headers();
    myHeaders.append("Api-Key", "<removed>");
    myHeaders.append("Api-Username", "system");
    myHeaders.append("Content-Type", 'application/json');

    let requestOptions = {
      method: 'POST',
      headers: myHeaders,
      redirect: 'follow'
    };

    fetch("https://forum.kirupa.com/posts.json?title=Testingggg Discourse API, Part 2&raw=Making a brand new post using the API and seeing if things still work.", requestOptions)
      .then(r => r.json())
      .then(result => response.send(result))
      .catch(error => response.send(error));
  });
});

fetch 코드를 단독으로 실행할 때 게시물이 정상적으로 생성되므로 이 코드가 동작한다는 점에는 확신을 가지고 있습니다. 그러나 functions 환경에서 실행할 때 "Internal Server Error"가 발생합니다. 로그를 확인해 보면 "Finished with status: crash"라고 나옵니다.

여기서 무엇이 잘못되었을지 의견이 있으신 분이 계신가요? Firebase functions를 통해 게시물 생성을 성공적으로 수행해 본 분이 있으신가요?

(cc @blake - HTTP 요청 방법을 사용하여 Node.js 접근 방식을 따랐고, 동일한 결과를 얻었습니다!)

감사합니다,
Kirupa

이 문제를 해결했고, 다른 사람이 같은 문제에 부딪히지 않도록 수정된 코드를 공유합니다:

exports.sendfeedback = onRequest({ cors: "https://www.kirupa.com" }, (req, res) => {
  let myHeaders = new fetch.Headers();
  myHeaders.append("Api-Key", "removed");
  myHeaders.append("Api-Username", "kirupaBot");
  myHeaders.append("Content-Type", 'application/json');

  let requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: JSON.stringify({
      "raw": req.query.raw,
      "title": req.query.title
    })
  };

  fetch("https://forum.kirupa.com/posts.json", requestOptions)
    .then(r => r.json())
    .then(result => res.send(result))
    .catch(error => res.send(error));
});