파일을 업로드하기 위해 우리가 작성한 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를 깔면 파일 업로드도 해볼 수 있다.
지금까지는 서버가 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();