Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejs
themeEmacs
titleserver.js
const express = require('express');
const axios = require('axios');
const bodyParser = require('body-parser');

const DALLE_URL = ''; // API URL 
const DALLE_API_KEY = ''; // API KEY

const app = express();
const router = express.Router();

router.post('/request', (request, response) => {
    const bodyData = request.body;

    requestDalle(response, bodyData)
        .then(() => response.end())
        .catch((error) => response.status(error.status).json(error).end());
});

/**
 * DALL·E 서버로 요청을 합니다.
 * @param {Object} body 전송할 Data Object
 * @param {Response} res 클라이언트 응답 객체
 * @returns {Promise}
 */
function requestDALLEServer(res, body) {
    const source = axios.CancelToken.source();
    const url = DALLE_URL;

    return new Promise((resolve, reject) => {
        try {
            axios.post(url, body, {
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': `Bearer ${DALLE_API_KEY}`
                },
                responseType: 'stream',
                cancelToken: source.token
            }).then(response => {
                // 응답 스트림을 클라이언트에 파이프
                response.data.pipe(res);
            }).catch(error => {
 
              // 요청 중 에러가 발생한 경우
                reject({
                    status: error.response ? error.response.status : 500,
                    message: error.message
                });
            });

            // 클라이언트의 연결이 끊어진 경우 요청을 취소
            res.on(res.on('close', () => {
                source.cancel('요청을 취소합니다.');
                // 클라이언트의 연결이 끊어진 경우, Promise를 완료
                resolve();
            });
        } catch (e) {
            // 예외 발생 시 reject 호출
            reject(e);
        }
    });
}


app.use(bodyParser.json());
app.use('/', router);
app.listen(8080);

...