функция firebase вернула неопределенное ожидаемое обещание или значение - PullRequest
0 голосов
/ 15 января 2019

мой код выглядит ниже. он выдает ошибку, когда я возвращаю ноль в обоих случаях. Должен ли я вернуть ноль в конце функции, а? я боялся, если это заставит функцию не ждать окончания

exports.on_user_created_update_generate_barcode = functions.database.ref("/users/{id}")
.onCreate((snapshot, context) => {
    console.log("start of on_user_created_update_generate_barcode ")   
    const user = snapshot.val();
    const referralCode = user._referralCode
    const uid = context.params.id
    console.log("Referral code is:" + referralCode + " for user:" + uid)



    bwipjs.toBuffer({
        bcid:        'code128',       // Barcode type
        text:        referralCode,    // Text to encode
        scale:       3,               // 3x scaling factor
        height:      10,              // Bar height, in millimeters
        includetext: true,            // Show human-readable text
        textxalign:  'center',        // Always good to set this
    }, function (err, png) {
        if (err) {
            console.err("failed to generate bar code:::" + err)
            return null
        } else {
            console.log("png generated")
            //console.log(png)
            const pngImg = 'data:image/png;base64,' + png.toString('base64')
            var db = admin.database();
            var userRef = db.ref('users')
            return userRef.child(uid).update({"_barcode": pngImg})
        }
    });

})

1 Ответ

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

Правильное сообщение об ошибке - вы не возвращаете ничего из вашей функции, что аналогично возвращению undefined. Вместо этого вы возвращаете null из функции обратного вызова, которую вы передали bwipjs.toBuffer(). Возвращаемое значение этой внутренней функции не распространяется на внешнюю функцию.

Если вы просто вернете ноль из верхнего уровня вашей функции, вы можете остановить эти сообщения об ошибках, но код не будет работать правильно. Облачные функции отключат всю асинхронную работу, начатую внутри функции, после того, как функция вернет значение, которое не является обещанием. Скорее всего, он вообще ничего не сделает.

Вам нужно будет вернуть обещание, которое разрешается, когда вся асинхронная работа завершена в вашей функции. Прямо сейчас это похоже на вызов toBuffer(), а также update() в базу данных реального времени.

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

...