I check authentication flow and all get and post requests on my localhost is perfect. But after i deploy Firebase functions and hosting, only get requests are success post request failed. Any one can help me what is the problem?
Browser result after post request fails
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: 'demir@test.com'
});
user.save();
}
});
app.listen(5000);
})*/
.catch(err => {
console.log(err);
});
exports.app = functions.https.onRequest(app);
//controllers
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);
});
}
//routes
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);
// add-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') %>