인스타그램 클론코딩 4일차 - BE

박병준·2021년 7월 25일
0
post-thumbnail

#2.4 File Upload

파일을 업로드하기 위해 우리가 작성한 schema가 아닌 apollo server가 지원하는 schema를 사용한다.

따라서 schema.js에서 합쳐서 schema로 server.js에 export하는게 아닌 각 typeDefs와 resolvers를 export하여 server.js에서 알아서schema를 만들도록 한다.

한번에 많은 서버를 돌릴 수 있기 때문에 이미지파일 같은 데이터용 파일들은 서버에 저장하지 않는다. 서버를 지웠다가 다시 만들 수 있으므로 서버에는 코드만 있는 것이 좋다.

유저가 내 서버로 파일을 업로드하면 나는 서버에 있는 파일을 aws에 업로드하고 aws는 나에게 url을 준다.

하지만 지금 당장은 node.js를 이용해 우리 서버에 저장하는 것을 알아볼 것이다.

Upload 타입은 Promise를 리턴한다.

//updateProfile.resolvers.js
//avatar의 타입은 Upload
let avatarUrl = null; //avatarUrl을 중복이 생기지 않게 해준다.
    if (avatar) {
        const { filename, createReadStream } = await avatar;
        const newFilename = `${loggedInUser.id}-${Date.now()}-${filename}`;
        const readStream = createReadStream();//provess.cwd()는  현재 폴더 위치를 나타낸다.
        const writeStream = createWriteStream(process.cwd() + "/uploads/" + newFilename);
        readStream.pipe(writeStream);
        avatarUrl = `http://localhost:4000/static/${newFilename}`;
    }

playground나 sandbox에서는 file 업로드를 못해보지만 altair를 깔면 파일 업로드도 해볼 수 있다.

#2.5 Ejecting from Apollo Server

지금까지는 서버가 apollo 서버 안에 있어서 우리가 설정할 수 있는게 없었다. 이제는 apollo-server-expree를 이용하여 express위에 apolloserver가 있게 하여 여러 설정들을 만들 수 있다.
npm install express apollo-server-express
npm install morgan

require('dotenv').config();
import express from "express";
import logger from "morgan";
import { graphqlUploadExpress } from "graphql-upload";
import { ApolloServer } from "apollo-server-express";
import { typeDefs, resolvers } from "./schema";
import { getUser } from "./users/users.utils";

async function startServer() {
    const server = new ApolloServer({
        typeDefs,
        resolvers,
        context: async ({ req }) => {
            return {
                loggedInUser: await getUser(req.headers.token),
            };
        },
    });
    await server.start();
    const app = express();
    app.use(graphqlUploadExpress());
    app.use(logger("tiny"));//request가 올 때마다 console에 찍어준다.
    app.use("/static", express.static("uploads")); // 서버가 uploads폴더를 읽을 수 있게 해준다.
    server.applyMiddleware({ app }); //applyMiddleware는 항상 app.use 아래에 와야한다.

    const PORT = process.env.PORT;

    app.listen({ port: PORT }, () => {
        console.log(`🎉Server is running on http://localhost:${PORT}/graphql`);
    });
}

startServer();
profile
뿌셔뿌셔

0개의 댓글

관련 채용 정보