部署 Firebase 函数和托管时出现发布请求问题。当我发布请求时,它无法验证身份验证流程

问题描述 投票:0回答:0

我检查了身份验证流程,我本地主机上的所有获取和发布请求都是完美的。但是在我部署 Firebase 函数和托管之后,只有获取请求是成功的请求失败。 任何人都可以帮我解决问题吗?

post请求失败后的浏览器结果

TypeError: Cannot read properties of undefined (reading 'isLoggedIn')
    at C:\Users\helez\appAdmin-Artvinca\functions\app.js:118:34
    at Layer.handle_error (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\layer.js:71:5)
    at trim_prefix (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:326:13)
    at C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:286:9
    at Function.process_params (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:346:12)
    at next (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:280:10)
    at Layer.handle_error (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\layer.js:67:12)
    at trim_prefix (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:326:13)
    at C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:286:9
    at Function.process_params (C:\Users\helez\appAdmin-Artvinca\functions\node_modules\express\lib\router\index.js:346:12)

app.js

require('dotenv').config();

const functions = require("firebase-functions");
const path = require('path');

const express = require('express');
const cors = require('cors');

const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);
const csrf = require('csurf');
const flash = require('connect-flash');
const multer = require('multer');

const errorController = require('./controllers/error');
const UserAdmin = require('./models/userAdmin');

const MONGODB_URİ = process.env.MONGO_DB

const app = express();
// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

const store = new MongoDBStore({
  uri: MONGODB_URİ,
  collection: 'sessions',
});
const csrfProtection = csrf();

const fileStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'images');
  },
  filename: (req, file, cb) => {
    cb(null, new Date() + '-' + file.originalname);
  }
});

const fileFilter = (req, file, cb) => {
  if (file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/jpeg' ) {
    cb(null, true);
  } else {
    cb(null, false);
  };
};

app.set('view engine', 'ejs');
app.set('views', 'views');



const adminRoutes = require('./routes/admin');
const authRoutes = require('./routes/auth');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({storage:fileStorage, fileFilter:fileFilter}).single('image'));
app.use(express.static(path.join(__dirname, 'design'))); 
app.use('/images', express.static(path.join(__dirname, 'images'))); 
app.use(session({
  name: "__session",
  secret: 'my-secret', 
  resave: false, 
  saveUninitialized: false,
  store: store 
}))

app.use(csrfProtection);
app.use(flash());

app.use((req, res, next) => {
  res.locals.isAuthenticated = req.session.isLoggedIn;
  res.locals.csrfToken = req.csrfToken();
  console.log("locals", res.locals)
  next();
});

app.use((req, res, next) => {
  if (!req.session.user) {
    return next();
  }
  UserAdmin.findById(req.session.user._id)
    .then(user => {
      if (!user) {
        return next();
      }
      req.user = user;
      next();
    })
    .catch(err => {
      next(new Error(err));
    });
});

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Method', 'GET, POST, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
  next();
});

app.use('/admin', adminRoutes);
app.use(authRoutes);

app.get('/500', errorController.get500);

app.use(errorController.get404);

app.use((error, req, res, next) => {
  res.status(500).render('500', {
    pageTitle: 'Error!',
    path: '/500',
    isAuthenticated: req.session.isLoggedIn
  });
  //console.log("app.js error", error)
});

mongoose
  .connect(
    MONGODB_URİ
  )
  /* .then(result => {
   UserAdmin.findOne().then(user => {
      if (!user) {
        const user = new UserAdmin({
          name: 'Demir',
          email: '[email protected]'
        });
        user.save();
      }
    });
    app.listen(5000);
  })*/
  .catch(err => {
    console.log(err);
  });

exports.app = functions.https.onRequest(app);

//控制器

exports.getwords = (req, res, next) => {
  const page = +req.query.page || 1;
  let totalItems;
  Words.find().countDocuments().then(numWords => {
    totalItems = numWords;

    return Words.find()
      .sort({ harf: "asc" }) 
      .skip((page - 1) * ITEM_PER_PAGE)
      .limit(ITEM_PER_PAGE)
    // .select('title price -_id')
    // .populate('userId', 'name')
  })
    .then(words => {
      res.render('admin/words', {
        content: words,
        pageTitle: 'Words',
        path: '/admin/words',
        currentPage: page,
        hasNextPage: ITEM_PER_PAGE * page < totalItems,
        hasPreviousPage: page > 1,
        nextPage: page + 1,
        previousPage: page - 1,
        lastPage: Math.ceil(totalItems / ITEM_PER_PAGE),
      });
    })
    .catch(err => {
      const error = new Error(err);
      error.httpStatusCode = 500;
      return next(error);
    });
};

exports.addWords = (req, res, next) => {
  const harf = req.body.harf;
  const wordsName = req.body.word;
  const description = req.body.description;

  const errors = validationResult(req);

  if (!errors.isEmpty()) {
    console.log(errors.array());
    return res.status(422).render('admin/add-word', {
      pageTitle: 'Add Word',
      path: '/admin/add-word',
      editing: false,
      hasError: true,
      content: {
        harf: harf,
        word: wordName,
        description: description,
      },
      errorMessage: errors.array()[0].msg,
      validationErrors: errors.array()
    });
  }

  const word= new Words({
    harf: harf,
    word: wordName,
    description: description,
  });

  word
    .save()
    .then(result => {
      res.redirect('/admin/words');
    })
    .catch(err => {
      const error = new Error(err);
      error.httpStatusCode = 500;
      return next(error);
    });
}

//路线

router.get('/words', isAuth, adminController.getWords);
router.post('/add-word',
  [
    body('harf')
      .isString()
      .isLength({ max: 1 })
      .trim(),

    body('word')
      .isString()
      .isLength({ min: 2 })
      .trim(),

    body('description')
      .isLength({ min: 5, max: 5000 })
      .trim()
  ], isAuth, adminController.addWord);

// 添加 word.ejs

<%- include('../includes/head.ejs') %>
<link rel="stylesheet" href="/css/forms.css">
<link rel="stylesheet" href="/css/product.css">
</head>
<body>
  <%- include('../includes/navigation.ejs') %>

    <main>
        
        <% if (errorMessage) { %>
            <div class="user-message user-message--error"><%= errorMessage %></div> 
        <% } %>
        <form class="product-form" action="/admin/add-word" method="POST" enctype="multipart/form-data">
 
                        
              <select id="harf" name="harf" class="form-select" aria-label="Default select example" onchange="myFunction()"> 
                <% function myFunction() { %>
                    var x = document.getElementById("harf").value;
                    document.getElementById("harf").innerHTML = x;
                 <% } %>
                <option selected >Harf Seçiniz</option>
                <% for (let i=0; i < harfler.length; i++) { %> 
                                      
                    <option value="<%= harfler[i] %>" 
                         > <%= harfler[i] %> </option>
                    <% } %>
            
              </select>
 
            <!-- <div class="form-control">
                <label for="harf">Harf</label>
                <input 
                class="<%= validationErrors.find(e => e.param === 'harf') ? 'invalid' : '' %>"
                type="text" 
                name="harf" 
                id="harf" 
                value=""
                 >
            </div> -->
            <div class="form-control">
                <label for="word">New Word</label>
                <input 
                class="<%= validationErrors.find(e => e.param === 'word') ? 'invalid' : '' %>"
                type="text" 
                name="word" 
                id="word" 
                value="">
            </div>
            <div class="form-control">
                <label for="description">Description</label>
                <textarea 
                    class="<%= validationErrors.find(e => e.param === 'description') ? 'invalid' : '' %>"
                    name="description" 
                    id="description" 
                    rows="10"></textarea>
            </div>
            <% if (editing) { %>
                <input type="hidden" value="<%= content._id %>" name="selectedId">
            <% } %>
            <input type="hidden" name="_csrf" value="<%= csrfToken %>">
            <button class="btn btn-outline-primary btn-sm" type="submit">Add Word</button>
            
        </form>
    </main>
    <%- include('../includes/end.ejs') %>
node.js firebase express session-cookies firebase-hosting
© www.soinside.com 2019 - 2024. All rights reserved.