Функции Firebase Невозможно установить заголовки после их отправки. - PullRequest
0 голосов
/ 31 января 2019

У меня есть функции Firebase, которые я не могу запросить из моего веб-приложения React.js, но не испытываю проблем с почтальоном.

Когда я пытаюсь сделать запрос через веб-приложение, я получаю следующую ошибку вмоя консоль Firebase:

Ошибка: невозможно установить заголовки после их отправки.

at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/worker/node_modules/express/lib/response.js:767:10)
at ServerResponse.json (/worker/node_modules/express/lib/response.js:264:10)
at ServerResponse.send (/worker/node_modules/express/lib/response.js:158:21)
at exports.uploadImage.functions.https.onRequest (/srv/index.js:21:13)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7)

И в веб-приложении я получаю ответ об ошибке 500 без каких-либовозвращенные данные.

Вот как делается мой запрос:

const data = {
    image: 'image url here',
    options: {
        tags: 'document,doctor',
    }
};
axios.post('*** FUNCTION URL HERE***/uploadImage', data, {
    headers: {
        'Content-Type': 'application/json',
    },
})

Однако, если я сделаю запрос через Почтальон , я получу ответ 200 с данными, которые яожидайте.

Вот как выглядит мой файл functions / index.js :

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cloudinary = require('cloudinary');
const cors = require('cors')({origin: true});

admin.initializeApp();

exports.uploadImage = functions.https.onRequest(async (req, res) => {
    cors(req, res, () => {});
    cloudinary.config({
        cloud_name: 'config here',
        api_key: 'config here',
        api_secret: 'config here',
    });

    try { 
        const data = Object.apply({folder: 'myortho'}, req.body.options);
        const response = await cloudinary.uploader.upload(req.body.image, data);
        return res.send(response);
    }catch(error) {
        return res.send(500, {message: 'Error uploading image', error});
    }
});

Я видел много вопросов, связанных с получаемой ошибкой, но многие изэти вопросы относятся к проблемам маршрутизации людей (для меня это не проблема, поскольку это облачная функция, а не мой внутренний сервер Node.js).

Это также ошибка, которую я не могу понятьтак как это успешно через Почтальон, но не через мой браузер, такЯ действительно смущен.

1 Ответ

0 голосов
/ 31 января 2019

Когда вы используете Cors, вы должны поместить свой код в функцию обратного вызова, которую вы передаете ему.Вы вообще не используете этот обратный вызов, и ваш код пытается отправить два ответа.Это должно быть больше так:

exports.uploadImage = functions.https.onRequest(async (req, res) => {
    cors(req, res, () => {
        cloudinary.config({
            cloud_name: 'config here',
            api_key: 'config here',
            api_secret: 'config here',
        });

        try { 
            const data = Object.apply({folder: 'myortho'}, req.body.options);
            const response = await cloudinary.uploader.upload(req.body.image, data);
            return res.send(response);
        } catch(error) {
            return res.send(500, {message: 'Error uploading image', error});
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...