【问题标题】:Firebase - ⚠ Error: Route.post() requires a callback function but got a [object Undefined]Firebase - ⚠ 错误:Route.post() 需要回调函数,但得到了 [object Undefined]
【发布时间】:2022-01-23 19:04:34
【问题描述】:

所以我在学习 Firebase / React 教程时遇到了一个问题,我刚刚完成了从这里开始的重构部分:https://www.youtube.com/watch?v=m_u6P5k0vP0&t=5590s

一切都很顺利,除了我发布一个新的 Twitter 风格更新的发布功能。并且尝试运行我得到的 firebase 服务器时出现的错误是:

⚠  Error: Route.post() requires a callback function but got a [object Undefined]
    at Route.<computed> [as post] (/Users/tmac/Programing/HolbertonFinal/MentorMatchingApp/firebase-fuctions/functions/node_modules/express/lib/router/route.js:202:15)
    at Function.app.<computed> [as post] (/Users/tmac/Programing/HolbertonFinal/MentorMatchingApp/firebase-fuctions/functions/node_modules/express/lib/application.js:482:19)
    at Object.<anonymous> (/Users/tmac/Programing/HolbertonFinal/MentorMatchingApp/firebase-fuctions/functions/index.js:10:5)
    at Module._compile (node:internal/modules/cjs/loader:1097:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
    at Module.load (node:internal/modules/cjs/loader:975:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:999:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at initializeRuntime (/Users/tmac/.nvm/versions/node/v17.3.0/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:655:29)
⚠  We were unable to load your functions code. (see above)

我会尝试在此处获取相关模块,但如果我遗漏了什么,请告诉我,我可以添加它。我对此很陌生,非常感谢所有帮助!

index.js

const functions = require("firebase-functions");
const app = require('express')();

const { postOneScream } = require('./handlers/screams'); // Not Working
const { signup, login } = require('./handlers/users');
const { FBAuth } = require('./util/fbAuth');


// Scream routes - Testing post functionality for social media feed posts
app.post('/screams', FBAuth, postOneScream); // Error: Route.post() requires a callback function but got a [object Undefined]

// Signup route
app.post("/signup", signup);

// Sign In route
app.post('/login', login);

// export api allows us to use express for our function formating
exports.api = functions.https.onRequest(app);

fbAuth.js

const { admin } = require('./admin');

// Check if user has a token for being logged in
module.exports = (req, res, next) => {
    let idToken;
    if(req.headers.authorization && req.headers.authorization.startsWith('Bearer ')){
      idToken = req.headers.authorization.split('Bearer ')[1];
    } else {
      console.error('No token found');
      return res.status(403).json({error: 'Unauthorized'});
    }
  
    admin.auth().verifyIdToken(idToken)
    .then(decodedToken => {
      req.user = decodedToken;
      console.log(decodedToken);
      return db.collection('users')
      .where('userId', '==', req.user.uid)
      .limit(1)
      .get();
    })
    .then(data => {
      req.user.handle = data.docs[0].data().handle;
      return next();
    })
    .catch((err) => {
      console.error('Error while verifying token', err);
      return res.status(403).json({err})
    })
}

screams.js

const { db } = require('../util/admin');

exports.postOneScream = (req, res) => {

    const newScream = {
        body: req.body.body,
        userHandle: req.user.handle,
        createdAt: new Date().toISOString()
    };

    db.collection('screams').add(newScream).then((doc) => {
        res.json({ message: `document ${doc.id} created successfully` })
    })
    .catch((err) => {
        res.status(500).json({ error: 'something went wrong' });
        console.error(err);
    })
};

再次感谢您提供的所有帮助,我真的很想学习 webdev,但是男孩有很多东西,每一步只会让我知道我不知道多少:)

【问题讨论】:

    标签: javascript node.js firebase


    【解决方案1】:

    因此,在 index.js 中,您正在从“./util/fbAuth”导入“FBAuth”,

    const { FBAuth } = require("./util/fbAuth");
    

    但在 './util/fbAuth' 中,您没有导出“FBAuth”。

    将您的 fbAuth 文件修改为类似的内容,

    const { admin } = require('./admin');
    
    // Check if user has a token for being logged in
    module.exports.fbAuth = (req, res, next) => {
        let idToken;
        if(req.headers.authorization && req.headers.authorization.startsWith('Bearer ')){
          idToken = req.headers.authorization.split('Bearer ')[1];
        } else {
          console.error('No token found');
          return res.status(403).json({error: 'Unauthorized'});
        }
      
        admin.auth().verifyIdToken(idToken)
        .then(decodedToken => {
          req.user = decodedToken;
          console.log(decodedToken);
          return db.collection('users')
          .where('userId', '==', req.user.uid)
          .limit(1)
          .get();
        })
        .then(data => {
          req.user.handle = data.docs[0].data().handle;
          return next();
        })
        .catch((err) => {
          console.error('Error while verifying token', err);
          return res.status(403).json({err})
        })
    }
    

    【讨论】:

    • 好的,原来问题出在我使用的 fbAuth.js 中 - exports.fbAuth 不是 - exports.FBAuth 大写 FB 解决了这个问题。谢谢!!
    • 是的,你也可以这样解决。
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多