app.js 3.35 KB
import "@babel/polyfill";
import dotenv from "dotenv";
import express from "express";
import morgan from "morgan";
import helmet from "helmet";
import cookieParser from "cookie-parser";
import bodyParser from "body-parser";
import mongoose from "mongoose";
import session from "express-session";
import flash from "express-flash";
import MongoStore from "connect-mongo";
import { localsMiddleware, uploadFile } from "./middlewares";
import File from "./models/File";
import routes from "./routes";
import globalRouter from "./routers/globalRouter";
import fileRouter from "./routers/fileRouter";
import redis from 'redis';
import JSON from 'JSON';
dotenv.config();
const app = express();
const client = redis.createClient(6379,'127.0.0.1');

const CokieStore = MongoStore(session);

app.use(helmet());
app.set("view engine", "pug");
app.use("/uploads", express.static("uploads"));
app.use("/static", express.static("static"));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true })); // json, html, text, urlencoded 할 거 없이 다 parser할 수 있도록 설정해줘야 한다.
app.use(morgan("dev"));

app.use(
  session({
    secret: process.env.COOKIE_SECRET,
    resave: true,
    saveUninitialized: false,
    store: new CokieStore({ mongooseConnection: mongoose.connection }),
  })
);
app.use(flash());
app.use(localsMiddleware);
app.use(routes.home, globalRouter);
//app.use(routes.files, fileRouter);
app.use(function(req,res,next){

      req.cache = client;

      next();

})

// Caching
app.use(function(req,res,next){
      req.cache = client;
      next();
})

app.get(`/files${routes.upload}`, (req, res) =>
    res.render("upload", { pageTitle: "Upload" }));
    
app.post(`/files${routes.upload}`, uploadFile, (req, res) => {
    // multer를 해야 파일이 넘어가는 것이 나타난다.
    req.accepts('application/json');
    const key = req.body.title;
    const value = JSON.stringify(req.body);

    req.cache.set(key, value, (err, data) => {
        if(err){
            console.log(err);
            res.send("error"+err);
            return;
        }
        req.cache.expire(key, 10);
        console.log(value);
        res.send(value);
    });
});
app.get('/files/:title', (req, res, next) => {
    const key = req.params.title;
    console.log('title : ' + key);

    req.cache.get(key, (err, data) => {
        if(err){
            console.log(err);
            res.send("error : " + err);
            return;
        }

        const value = JSON.parse(data);
        res.json(value);
    });
});

app.get('/view_cache', (req, res) => {
    req.cache.get('/files/:title', async (err, data) => {
        if(err){
            console.log(err);
            res.send("error : " + err);
            return;
        }
        if(!data) {
            const allData = await File.find({}).sort({ _id: -1 });
            const dataArr = JSON.stringify(allData);
            req.cache.set('/files/:title', dataArr, (err, data) => {
                if(err){
                    console.log(err);
                    res.send("error :" + err);
                    return;
                }
                req.cache.expire('/files/:title', 10);
                res.send(dataArr)
            })
        }
        else {
            res.send(data)
        }
    });
});




export default app; // 파일을 불러올때 app object를 준다는 의미.