当前位置: 首页 > 知识库问答 >
问题:

错误“函数返回未定义的、预期的promise或值”,即使在所有地方返回后也是如此

乐宜民
2023-03-14

我是Node.js的新手,即使在阅读了其他stackflow用户提供的教程之后,我也在为承诺而挣扎。我已经花了整整一个晚上在这方面,我正在寻求帮助。我得到以下错误“Function return undefined,expected Promise or value”。我的代码在下面。我做错了什么?我还怀疑我必须使用await/async,因为它看起来像是我的代码在没有等待第一个get完成的情况下运行。

const admin = require('firebase-admin');
const functions = require('firebase-functions');
var db = admin.firestore();

exports.declinedRequest = functions.firestore
.document('requests/{requestId}')
.onUpdate((change, context) => {
  const newValue = change.after.data();
  const status = newValue.status;
  const request = context.params.requestId;
  var registrationToken;
  var message;

  if(status=="created") {
    console.log('Checkpoint1 ',context.params.requestId);
    newValue.friends.forEach(doc => {
      console.log('Checkpoint 2: ', doc);

      var usersRef = db.collection('users');
      var query = usersRef.where('mobile', '==', doc).get()
        .then(snapshotFriend => {
          if (snapshotFriend.empty) {
            console.log('Checkpoint3.');
            return;
          }  

        snapshotFriend.forEach(mobile => {

        registrationToken = mobile.data().fcmToken;
        console.log('FCM token =>', registrationToken);
        if (!registrationToken) {
          console.log('No fcmToken available');
          return;
        }  
         message = {
          notification: {
            body: "Request still available from " + newValue.requesterName,
            sound: "default", 
            badge: 1
            },
          data: {
            requestId: `${request}`
          }
        };

        console.log('FCM token message created');

        }) 
      })
    })
  } else {
    return;
  }
 return admin.messaging().sendToDevice(registrationToken, message)
      .then(function (response) {
        console.log("Successfully sent message:", response)
     })
      .catch(function (error) {
        console.log("Error sending message:", error);
     }) 

})

共有1个答案

羊柏
2023-03-14

尝试下面的代码,希望这将工作。

    const admin = require('firebase-admin');
    const functions = require('firebase-functions');
    const Promise = require('bluebird');
    const _ = require('lodash');
    let db = admin.firestore();

    exports.declinedRequest = functions.firestore
    .document('requests/{requestId}')
    .onUpdate((change, context) => {
        const newValue = change.after.data();
        const status = newValue.status;
        const request = context.params.requestId;
        if (status == "created") {
            console.log('Checkpoint1 ', context.params.requestId);
            allPromises = [];
            newValue.friends.forEach(doc => {
                console.log('Checkpoint 2: ', doc);
                const usersRef = db.collection('users');
                // query for each document return promise.
                allPromises.push(queryForEachDocument(doc,request,usersRef));
            });
            return Promise.all(allPromises);
        } else {
            return Promise.reject / resolve('Whatever you want.');
        }
    })

    function queryForEachDocument(doc,request,usersRef) {
    let promiseInvoices = []
    let registrationToken;
    let message;
    return usersRef.where('mobile', '==', doc).get().then((snapshotFriend) => {
        if (_.isEmpty(snapshotFriend)) {
            console.log('Checkpoint3.');
            return Promise.reject(new Error('Your error'));
        }
        snapshotFriend.forEach(mobile => {
            registrationToken = mobile.data().fcmToken;
            console.log('FCM token =>', registrationToken);
            if (!registrationToken) {
                console.log('No fcmToken available for', newValue.requesterName);
                // Do anything you want to change here.
                return Promise.reject(new Error('No fcmToken available for',newValue.requesterName));
            }
            message = {
                notification: {
                    body: "Request still available from " + newValue.requesterName,
                    sound: "default",
                    badge: 1
                },
                data: {
                    requestId: request
                }
            };
            console.log('FCM token message created');
            // send invoice for each registrationToken
            promiseInvoices.push(sendInvoice(registrationToken, message))
        });
    }).then(() => {
        return Promise.all(promiseInvoices);
    })
    }
    function sendInvoice(registrationToken, message) {
    return admin.messaging().sendToDevice(registrationToken, message)
        .then(function (response) {
            console.log("Successfully sent message:", response)
        })
        .catch(function (error) {
            console.log("Error sending message:", error);
        })
    }
 类似资料:
  • 新的云功能和承诺。我尝试在不同的位置添加承诺,但仍然在日志中得到消息。第一,我不确定我应该在哪里添加承诺,第二,我是否应该什么也不回。在调用match(如果条件满足,则创建channel)之后,我不需要执行另一个函数。虽然触发onCreate会有多个用户,所以我想确保每次执行一个用户。 编辑1-我尝试将事务更改为使用await,这样它将只在事务之后更改UserLife节点。得到这两个警告。1)应在

  • 问题内容: 我正在使用Firebase开发Server。 我已经在Youtube上复制了Google Developer的视频。 它工作正常,但在日志中出现错误: 返回的函数未定义,预期的承诺或价值 它说函数返回了,但是我返回了一个“ set” 我该如何解决? 我是Firebase Nodejs的初学者。 问题答案: 正如弗兰克在对您的帖子的评论中所指出的那样,产生警告的return语句就是这样的

  • 我正在使用JUnit和Mockito库来测试我的应用程序。问题是,当我在代码下面执行时,值在运行时没有返回空列表,并且测试失败。理想情况下,当get执行时,它应该返回空列表 我热切期待着支持。有没有人能帮我一下,如何通过这个测试用例???。如何通过Mockito使第8行的控件通过测试用例??? 请假设,下面两个类没有真实的代码,我们只有二进制文件作为JAR文件,我们不能修改下面的代码....我附上

  • 问题内容: 我只是在创建一个用于检查对象数组中某个值的函数,但是由于某种原因,它一直在返回。这是为什么? 问题答案: 在函数中,您是从传递给的函数返回的,而不是从返回的。 您可以这样修改它: 但这会迭代所有元素,即使立即找到该项目也是如此。这就是为什么最好使用一个简单的循环: 请注意,我还修改了您的代码以返回值,而不是键。我想这就是意图。您可能还对另一个迭代函数感到困惑:传递给forEach的回调

  • 问题内容: 我目前正在阅读John Papa的AngularJS样式指南,并看到了以下代码: 您可以看到函数和是 在 函数返回值 之后 定义的。这是如何运作的?它是否符合标准并且可以在所有浏览器中使用(例如,来自IE 6)? 问题答案: 您可以看到函数和是在函数返回值之后定义的。 那是从它们的编写位置看的样子,是的,但是实际上它们是在函数中的任何分步代码完全运行之前定义的。有时这被称为“提升”函数

  • 问题内容: 我正在尝试获取返回值,但始终无法定义。 我不确定如何获取任何返回值并在其他地方使用它?我需要使用此返回值来与其他函数进行验证,但是它似乎在范围之内。 这是我的代码: 问题答案: 移动以下行: 进入回调: 如果希望返回某些内容,则还需要向其添加回调,以便可以使用它的返回值。例如,如果您希望这样做: 这将无法正常工作,因为内容的最终值将被异步检索。相反,您需要这样做: 您不能异步返回数据。