Ошибка: функция возвратила неопределенное, ожидаемое обещание или значение - PullRequest
0 голосов
/ 08 июля 2019

Я установил функцию pubsub с функциями firebase, чтобы время от времени выполнять некоторые операции в Firestore.Для этого мне нужно сделать запрос в сторонний API для получения обновленных данных, а затем я хочу вставить эти данные в правильный сбор и документ в Firestore.

const request_promise = require('request-promise')

exports.scheduledFunction = functions.pubsub.schedule('every 2 minutes').onRun((context) => {
    console.log('This will be called every 2 minutes')
    var username = ''
    var password = ''
    var options = {
        url: 'path.to.api.com',
        auth: {
            user: username,
            password: password
        },
        json: true
    }

    request_promise(options)
        .then(function (product) {
            console.log(product.product_id)
            db.collection('products').doc(product.product_id).set(product)
                .then(() => {
                    console.log('Document successfully written')
                })
                .catch(error => {
                    console.log('Error writing product to firestore', error)
                })
        })
        .catch(function (err) {
            console.log('Failed to get product', error)
        })
  });

ВПриведенный выше код, если я закомментирую вызов для добавления данных в Firestore, правильно выводит product_id на консоль, поэтому я знаю, что запрос работает, но с оставленным в нем я получаю «Функция вернула неопределенное, ожидаемое обещание или значение».

Ответы [ 2 ]

1 голос
/ 08 июля 2019

При правильном построении цепочки обещаний это выглядит более чистым

      rp(options)
        .then((product) =>
        {
            console.log(product.product_id)
            // add an implicit return here
            return db.collection('products').doc(product.product_id).set(product)
        })
        .then(() =>
        {
            console.log('Document successfully written')
            // need's to return something here, using a boolean for simplicity
            return true;
        })
        .catch(function (err) 
        {
        console.log('Failed to get product', error);
        // throw will exit the function call
        throw Error('Failed to get product', error);
        });

Также не рекомендуется выбрасывать ошибки из блока catch, блок catch предназначен для перехвата ошибок и их обработки, а не для генерации ошибок.В вашем коде есть несколько битов, которые нужно улучшить, но это не является частью этого вопроса

Cheers, Happy Coding

1 голос
/ 08 июля 2019

Вы ничего не возвращаете во время казни.A console.log не рассматривается как return

request_promise(options)
        .then(function (product) {
            console.log(product.product_id)
            // add an implicit return here
            return db.collection('products').doc(product.product_id).set(product)
                .then(() => {
                    console.log('Document successfully written')
                    // need's to return something here, using a boolean for simplicity
                    return true;
                })
                .catch(error => {
                    console.log('Error writing product to firestore', error)
                    // throw will exit the function call
                    throw Error('Error writing product to firestore', error);
                })
        })
        .catch(function (err) {
            console.log('Failed to get product', error);
            // throw will exit the function call
            throw Error('Failed to get product', error);
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...