アポロサーバは、ローカルストレージとAWS S 3上でファイルアップロードを表します


概要:ファイルを1つのストレージから別のファイルにアップロードします.エクスプレス、アポロサーバエクスプレス、AWS SDKを使用します.
ファイルのアップロードは、Webアプリケーションの基本です.そして、初心者と中間のためにアポロServer急行を使用しているファイルアップロードの詳細に関する多くの情報がありません.だから、誰もがこの投稿を読んで、いくつかのコードを理解していない場合は、コメントを無料で感じてください、私はできるだけ早く更新されます.さて、コードを書きましょう.
初期化package.json 使用しているワーキングディレクトリで
npm init -y
それではモジュールをインストールしましょう.
npm install express apollo-server-express dotenv nodemon uuid aws-sdk
モジュールのいくつかに精通していない場合は、モジュール名をgoogleにでき、そのドキュメントから学ぶことができます.
オープンpackage.json 以下のように変更します.
"main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  }
ご覧の通り.app.js 私のサーバーファイルですが、あなたが欲しいものに名前を変更することができます.
あなたならばmain: プロパティはapp.js それからファイル名をapp.js あなたの働くディレクトリで.ファイルを作成する.env 環境変数を格納するには.現在app.js , 次のコードをペーストします
const express = require('express');
const app = express();
const {ApolloServer} = require('apollo-server-express');
require('dotenv').config();

let server = new ApolloServer({
    typeDefs, resolvers
});
server.applyMiddleware({app});

let PORT = process.env.PORT || 5000;
app.listen(PORT, ()=>{
    console.log(`Server started on ${PORT}...`);
})
これは私たちのサーバーを取得し、ポート5000で実行されます.
今あなたのAWSaccesskeyid , secretaccesskey , region and bucket-name . 次に、config そしてファイルの中にs3.js 次のコードをコピーします.
3 .js
const aws = require('aws-sdk');

let s3 = new aws.S3({
    credentials: {
        accessKeyId: process.env.ACCESS_KEY_ID,
        secretAccessKey: process.env.SECRET_ACCESS_KEY
    },
    region: process.env.REGION,
    params : {
        ACL : 'public-read',
        Bucket : process.env.AWS_BUCKET
    }
});

module.exports = s3
ここでは、すべての環境変数は.env ファイル.
ディレクトリ名schema と2つのファイルを作成するtypedefs.js and resolvers.js 次のコードをペーストします.
typedefs.js
const {gql} = require('apollo-server-express')

const typedefs = gql`
    type Query {
        uploadedFiles : [File]
    }
    type Mutation {
        singleUploadLocal (file: Upload!) : File
        multipleUploadLocal (files: [Upload]!) : [File]
        singleUploadS3 (file : Upload!) : File
        multipleUploadS3 (files : [Upload]!) : [File]
    }
    type File {
        success : String!
        message : String!
        mimetype : String
        encoding : String
        filename : String
        location : String
    }
`;
module.exports = typedefs;
リゾルバjs
const fs = require('fs');
const {v4: uuid} = require('uuid');
const s3 = require('../config/s3');

const processUpload = async (file)=>{
    const {createReadStream, mimetype, encoding, filename} = await file;
    let path = "uploads/" + uuid() + filename;
    let stream = createReadStream();
    return new Promise((resolve,reject)=>{
        stream
        .pipe(fs.createWriteStream(path))
        .on("finish", ()=>{

            resolve({
                success: true,
                message: "Successfully Uploaded",
                mimetype, filename, encoding, location: path
            })
        })
        .on("error", (err)=>{
            console.log("Error Event Emitted")
            reject({
                success: false,
                message: "Failed"
            })
        })
    })
}

let processUploadS3 = async (file)=>{
    const {createReadStream, mimetype, encoding, filename} = await file;
    let stream = createReadStream();
    const {Location} = await s3.upload({
        Body: stream,
        Key: `${uuid()}${filename}`,
        ContentType: mimetype
    }).promise();
    return new Promise((resolve,reject)=>{
        if (Location){
            resolve({
                success: true, message: "Uploaded", mimetype,filename,
                location: Location, encoding
            })
        }else {
            reject({
                success: false, message: "Failed"
            })
        }
    })
}
const resolvers = {
    Mutation: {
        singleUploadLocal : async (_, args)=>{
            return processUpload(args.file);
        },
        multipleUploadLocal : async (_, args) =>{
            let obj =  (await Promise.all(args.files)).map(processUpload);
            console.log(obj);
            return obj;
        },
        singleUploadS3 : async (_, args)=>{
            return processUploadS3(args.file);
        },
        multipleUploadS3 : async (_, args)=>{
            let obj = (await Promise.all(args.files)).map(processUploadS3);
            return obj;
        }
    }
}

module.exports = resolvers;
今テストするために、私はクロム拡張子を使用していますAltair これにより、以下のように私のGraphSQLクエリのファイルを簡単にアップロードできます.

あなたは私のgithub repoで上記のコードを見つけることができます:
https://github.com/kingmaker9841/apollo-multiple-upload

良い一日を!