인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김명재님의 프로필 이미지
김명재

작성한 질문수

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

S3에 대신 파일 올리기

Error: Data too long for column

작성

·

444

0

req.file을 보면 아래와 같이 나옵니다.
{

fieldname: 'img',

originalname: 'á\x84\x89á\x85³á\x84\x8Fá\x85³á\x84\x85á\x85µá\x86«á\x84\x89á\x85£á\x86º 2023-11-22 á\x84\x8Bá\x85©á\x84\x92á\x85® 8.36.00.png',

encoding: '7bit',

mimetype: 'image/png',

size: 156946,

bucket: 'whatsup1',

key: 'original/1700700649389_á\x84\x89á\x85³á\x84\x8Fá\x85³á\x84\x85á\x85µá\x86«á\x84\x89á\x85£á\x86º 2023-11-22 á\x84\x8Bá\x85©á\x84\x92á\x85® 8.36.00.png',

acl: 'private',

contentType: 'application/octet-stream',

contentDisposition: null,

contentEncoding: null,

storageClass: 'STANDARD',

serverSideEncryption: null,

metadata: undefined,

location: 'https://whatsup1.s3.ap-northeast-2.amazonaws.com/original/1700700649389_%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%8F%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%85%C3%A1%C2%85%C2%B5%C3%A1%C2%86%C2%AB%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%A3%C3%A1%C2%86%C2%BA%202023-11-22%20%C3%A1%C2%84%C2%8B%C3%A1%C2%85%C2%A9%C3%A1%C2%84%C2%92%C3%A1%C2%85%C2%AE%208.36.00.png',

etag: '"9afb9409e1bcd41269629b6bb1100245"',

versionId: undefined

}
제로초님은 사진 파일 확장자가 jpg로 뜨는데 저는 png로 뜹니다..

s3에 저장되는 쪽이 아니라 사진을 파일로 만드는 부분에서 문제가 있는 것 같은데 어느부분에서 손을 봐야할지 잘 모르겠습니다..

const { S3Client } = require("@aws-sdk/client-s3");
const multerS3 = require("multer-s3");

const s3 = new S3Client({
  credentials: {
    accessKeyId: process.env.S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
  },
  region: "ap-northeast-2",
});

const upload = multer({
  storage: multerS3({
    s3,
    bucket: "whatsup1",
    key(req, file, cb) {
      cb(null, `original/${Date.now()}_${file.originalname}`);
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
});

그리고 추가적인 질문이 있는데 localhost로 서버를 작동시킬때 db는 잘 보이는데 lightsail로 작동시킨 db가 보이지 않습니다..
mysql connection 추가 버튼 눌러서 hostname을 aws에서 제공해준 ip로 바꾸면 되는거 아닌가요?
그런데 그렇게 하고 연결을 하니깐 버퍼링이 걸리면서 연결이 되지 않습니다..

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

일단 파일명이 한글이라 인코딩과정에서 너무 길어져서 그렇습니다. 파일명 저장하는 컬럼 길이를 늘리셔야 합니다.(sql 필요) 그리고 png 파일을 업로드하신 거 맞나요?

aws db가 접근이 안 된다면 보안그룹에서 인바운드 3306 포트 허용하셔야 합니다.

김명재님의 프로필 이미지
김명재
질문자

Data too long error는 table에서 column length를 늘려서 해결했습니다.

그리고 찾아보니깐 db가 lightsail인스턴스 내에 있을때는 인스턴스 방화벽 오픈만 해주면 된다고 해서
스크린샷 2023-11-23 오후 2.02.20.png방화벽 오픈 해주고 실행했는데
workbench에서 아래와 같은 에러를 보여줬습니다.
Cannot Connect to Database Server

Your connection attempt failed for user 'root' to the MySQL server at 13.125.223.66:3306:

Host '116.33.131.91' is not allowed to connect to this MySQL server

Please:

1 Check that MySQL is running on address 13.125.223.66

2 Check that MySQL is reachable on port 3306 (note: 3306 is the default, but this can be changed)

3 Check the user root has rights to connect to 13.125.223.66 from your address (MySQL rights define what clients can connect to the server and from which machines) 

4 Make sure you are both providing a password if needed and using the correct password for 13.125.223.66 connecting from the host address you're connecting from

보니깐 mysql 권한이 root사용자에게 부여 됐는지 살펴보라는 말이 있어서

입력해서 확인해보니깐
+------------------+-----------+

| user             | host      |

+------------------+-----------+

| mysql.infoschema | localhost |

| mysql.session    | localhost |

| mysql.sys        | localhost |

| root             | localhost |

+------------------+-----------+

4 rows in set (0.01 sec)

 

mysql> SHOW GRANTS FOR 'root'@'localhost';

+------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Grants for root@localhost                                                                            |

+------------------------------------------------------------------------------------------------------+

| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON . TO root@`localhost` WITH GRANT OPTION                                              

| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,XA_RECOVER_ADMIN ON . TO root@`localhost` WITH GRANT OPTION |

| GRANT PROXY ON ``@`` TO root@`localhost` WITH GRANT OPTION                                            

+------------------------------------------------------------------------------------------------------------------------+

3 rows in set (0.01 sec)

이런식으로 나오는데 이게 권한을 가지고 있는게 맞나요?... 제가 아직은 sql을 잘 몰라서요..
일단 gpt한테 물어보니깐 권한이 잘 부여되어있다고는 하는데 .혹시 더 설정 해야 할게 있나요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

https://stackoverflow.com/a/8348560

localhost면 안 되고 % 이어야 합니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

https://stackoverflow.com/a/11225588

이게 좀 더 맞겠네요

김명재님의 프로필 이미지
김명재
질문자

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'zzx13579';

Query OK, 0 rows affected (0.01 sec)

 

mysql> GRANT ALL PRIVILEGES ON . TO 'root'@'%' WITH GRANT OPTION;

Query OK, 0 rows affected (0.01 sec)

| user             | host      |

+------------------+-----------+

| root             | %         |

| mysql.infoschema | localhost |

| mysql.session    | localhost |

| mysql.sys        | localhost |

| root             | localhos


잘 실행이 된 것 같은데 계속 오류가 발생하네요.. 권한 문제가 아닌 것 같습니다..

궁금한게

| root             | localhos

| root             | %         |

둘다 localhost를 나타내는것 같은데 어떻게 다른건가요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

localhostlocalhost(라이트세일 내부)에서만 db 접근 가능하다는 뜻이고 %는 모든 곳에서 접근 가능하다는 뜻입니다. root@localhost를 지워야하나 싶기도 하네요.

김명재님의 프로필 이미지
김명재

작성한 질문수

질문하기