[heroku] Cannot find module 'webpack' 에러 해결 방법

 

오랜만에 다시 heroku에 프로젝트 배포를 하려는데

자꾸 저 에러가 뜬다

 

분명 내 컴퓨터에선 잘 돌아가는데 자꾸 웹팩을 찾을수 없단다

로그테일을 보니

2021-02-14T08_12_14_075Z-debug.log

1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
2021-02-14T08:12:14.072560+00:00 app[web.1]: npm ERR! Failed at the pirates@1.0.0 start script.
2021-02-14T08:12:14.072710+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2021-02-14T08:12:14.084426+00:00 app[web.1]: 
2021-02-14T08:12:14.084751+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2021-02-14T08:12:14.084956+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2021-02-14T08_12_14_075Z-debug.log
2021-02-14T08:12:14.170327+00:00 heroku[web.1]: Process exited with status 1
2021-02-14T08:12:14.254487+00:00 heroku[web.1]: State changed from starting to crashed
2021-02-14T08:12:20.716795+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=cheesu001.herokuapp.com request_id=a9a004e0-d046-4f25-a2f8-545fab788982 fwd="124.58.249.175" dyno= connect= service= status=503 bytes= protocol=https
2021-02-14T08:12:21.009151+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=cheesu001.herokuapp.com request_id=a06f1f6d-04ae-4700-8e24-212cb5cab358 fwd="124.58.249.175" dyno= connect= service= status=503 bytes= protocol=https
2021-02-14T08:12:22.548024+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/sw.js" host=cheesu001.herokuapp.com request_id=e1dbf1a0-e255-41b2-826f-2abcb89bb87f fwd="124.58.249.175" dyno= connect= service= status=503 bytes= protocol=https
 
cs

 

뭐 이런것도 쭉 올라오고

디펜던시설정에서 뭔가 잘못된건가 해서 버전도 올려보고 캐쉬도 멈추고 

npm 인스톨도 다시 해보고 하는데도 해결될 기미가 보이지 않았다.

 

한참동안 구글링하면서 아둥바둥 하다가도 대체 뭐가 문제 일까하며 조금씩

 

수정하고 배포하고 수정하고 배포하고 하는데

배포할때마다 거슬리는 뭔가가 나온다

 

 

 

난 그냥 헤로쿠 배포하면서 꾸미기 용도로 저런 모양 만들어 놓은건줄 알았더니

내용을 보니 이제 Heroku-16 스택은 지원을 안한단다

검색해서 내용을 좀더 찾아보니 앵간하면 20으로 마이그레이션을 하라고 한다.

아 설마 저거때문일까 설마 ㅋㅋㅋ 아직까진 지원하는거잖아 ㅋㅋㅋ

 

저걸 보고도 1시간을 더 삽질하다가

진짜 예전스택이라 버전업된거 인식을 못하고 오류뜨는건가 싶어서

 

바로 heroku 20 stack로 마이그레이션 한 후에

 

배포했더니 바로 해결...

 

이제 잘돌아간다..

 

 

하... 

 

4년전에 만들어놧던 프로젝트에 인공호흡기 달아준다고 반나절을 삽질했다.

 

그래도 다시 서비스되는걸 보니 기분이 뿌듯 하다.

 

 

 

 

[atlas] MongoError: user is not allowed to do action [find] 에러 해결 방법

 

파서도 고치고 비밀번호 특수문자도 고쳤는데 또 에러가 난다.

스택오버플로우를 뒤져보다 어떤 사람의 답변을 보니

 

atals쓰는 모든 사람들에게 처음 나타나는 오류란다.

 

atals에서 사용자 권한설정을 안해줘서 나타나는 오류라는 것

 

atals 웹사이트에 들어가서 로그인 후

 

클러스터의 Database Access 를 클릭해 사용자 Edit를 누르면

 

 

저기 동그라미 친 부분에서 어드민으로 주거나 알아서 권한을 부여해주면 된다.

 

읽기만 허용시킨다던가 읽기쓰기 둘다 해도 된다거나 혹은 아예 나처럼 관리자권한으로 준다던가 하면 해결이 되고

 

또 저 외에도 에러가 난다면 

 

본인이 화이트리스트에 설정을 제대로 했는지 확인해보도록 하자

 

Network Access에서 나는 기본적으로 모든 아이피에서 허용을 시켜놨는데

그걸 지우고 따로 화이트리스트로 IP관리를 하다가 다른 IP에서 접속을 시도 했을때도

위와같은 에러가 나타난다고 한다.

 

 

 

 

[mongoose] MongoParseError: URI does not have hostname, domain name and tld 오류

 

파서 까지 설정을 했는데 또 오류가 난다!

역시 이럴땐 스택오버 플로우 형님들한테 찾아가야 한다.

비밀번호에 특수문자가 들어간 경우에 나타나는 오류였다.

 

! 이나 # 같은 문자가 들어간 경우엔

 

%21 이나 %23 으로 바꿔서 입력 해야 한다.

 

만약 비밀번호가

개발자123## 이라면 개발자123%23%23  으로 적어야 한다는것.

 

 

[mongoose] DeprecationWarning: current URL string parser is deprecated 오류 해결 방법

 

몽구스 버전 업데이트 이후 다시 접속을 하려 해보니

오류메세지가 바뀌었다

 


Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
(node:2672) Warning: Accessing non-existent property 'MongoError' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:2672) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

 

파싱 문제였다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import mongoose from 'mongoose';
 
mongoose
  .connect("mongodb+srv://[사용자]:[암호]@cheesustudy.ujge0.mongodb.net/[db]?retryWrites=true&w=majority", {
    useNewUrlParser: true,
    useCreateIndex: true,
  })
  .then(() => {
    console.log("Connected to MongoDB");
  })
  .catch((err) => {
    console.log(err);
  });
cs

 

이렇게 바꿔주면 된다.

 

 

얼마전 예전에 공부용으로 만들어 뒀던 프로젝트에서 사용하는

MLab mongoDB 서비스가 atlas로 통합된다고

atlas로 마이그레이션 하지 않으면 데이터가 다 날아갈 것이라는 내용의 메일이 날아 왔었다.

 

당장 데이터가 날아간다는데 부랴부랴 마이그레이션 문서 찾아서 하라는대로 해서 

 

데이터를 옮겨놓고 클러스터 만들어서 굴려놓긴 했는데 

서비스하는곳이 바뀌면서 접속 URL이 달라져버렸다

 

기존엔

 

mongodb://[사용자]:[비밀번호]@ds145389.mlab.com:45389/[DB]

이런식이었는데

Atlas로 바뀌면서

mongodb+srv://[사용자]:[비밀번호]@cheesustudy.ujge0.mongodb.net/[DB]?retryWrites=true&w=majority

이렇게 형식이 많이 바뀌었다

url만 바꾸면 되는줄 알고

nodejs db 커넥트 하는 부분에서 URL을 바꿨는데

에러가 뜬다

 

대충 에러 내용은 접속 url형식이 +srv << 이렇게 된건 못쓴다는 내용이었다.

 

구글링을 해보니 mongoose 예전 버전에서는 저 url방식으로 접속이 불가능 하다는 것.

 

다른 방법은 없고 일단 몽구스 버전부터 올려야 했다.

 

3년전인가 4년전에 만들어 놓고 놔뒀던 소스라 잘 될까 했는데

 

역시 안된다.

몽구스 버전 업데이트를 하는데 의존성에 엮여있는것들이 나오고

 

그것들도 버전이 낮아서 제대로 안된다는 내용..;;

 

어차피 예전에 쓰던 노트북에 있던 프로젝트였고

 

현재 집에서 쓰는 데스크탑에선 셋팅한적이 없으므로 아얘 

 

데스크탑에서 새로 셋팅을 하기로 했다.

 

node설치하고 npm으로 새로 싹다 받아서 

 

예전에 깃에 올려뒀던 소스 받고 몽구스 버전만 바꾸어 주었다.

 

혹시 나처럼 mlab 쓰다가 atlas로 강제 이전하게 되었는데

 

디비 접속 오류 나는 사람은 그냥 싹 밀고 버전업 하면 될 것이다.

 

 

1
2
3
4
5
list.sort(function(a, b) { // 오름차순
    return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
  });
 
 
cs

 

배열안의 id값이나 name 순서대로 재정렬 할때 사용 하는 방법

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var list = [{"name":"사과""id":"a1"},{"name":"배""id":"a2"},{"name":"사과""id":"a1"},{"name":"바나나""id":"a3"}......] ;
 
var resultArray = []; // 카운팅해서 반환할 결과값 배열
  list.map(item => {
    //for each item in arrayOfObjects check if the object exists in the resulting array
    if(resultArray.find(object => {
        if(object.Name === item.Name && object.id === item.id) {
            //if the object exists iterate times
            object.cnt++;
            return true;
            //if it does not return false
        } else {
            return false;
        }
    })){
    } else {
        //if the object does not exists push it to the resulting array and set the times count to 1
        item.cnt = 1;
        resultArray.push(item);
    }
  });
 
 
cs

 

배열안에 중복된 객체를 제거하고 중복된 객체가 몇개인지 세는 방법.

 

 

 

[MSSQL] 로우 합치기 STUFF, FOR XML PATH, mysql group_concat 기능


개발을 하다보면 가끔씩 필요한 기능이다.


중복되는 로우가 있는데 조인하면 다른 데이터들도 같이 나올때


중복되는거 합치고 여러로우로 된 데이터들만 한 컬럼에 한줄로 표현하고 싶을때가 있다.



ID 

data 

 사과

배 

 2

망고 

사과 

배 


이런 경우


ID 

data 

사과,배 

 2

망고,사과,배 


이렇게 뽑아내고 싶을때 사용하는 방법이다.



여기서 사용할건 STUFF와 FOR XML PATH다


간단하게 그냥 예제를 보도록 하자


1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    DISTINCT ID, -- id 중복 제거
    STUFF(( 
        SELECT 
            ',' + DATA
        FROM 
            dataTbl b 
        WHERE 
            b.ID = a.ID 
            FOR XML PATH('') ),1,1,'') AS NAME 
FROM 
    dataTbl a
 
cs


이런식으로 사용하면 된다.


dataTbl이 단일 테이블이 아니라 그냥 괄호로 묶어서 조인해놓은 서브쿼리를 사용해도 무방하다.



[JAVA] VO리스트에 add로 값 넣고 싶을때


프로젝트마다 다른 방식이겠지만


나는 주로


1
2
List<dataVO> result  = null;
result =  service.loadData(vo);
cs


이런식으로 가져 오는 방식을 선호한다


그런데


1
2
3
4
5
6
7
8
9
10
11
 
List<dataVO> result = null;
 
List<dataVO> data1 = null;
List<dataVO> data2 = null;
List<dataVO> data3 = null;
List<dataVO> data4 = null;
data1 =  service.loadData(vo1);
data2 =  service.loadData(vo2);
data3 =  service.loadData(vo3);
data4 =  service.loadData(vo4);
cs


각각의 데이터들을 result에 넣고자 하면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
List<dataVO> result = null;
 
List<dataVO> data1 = null;
List<dataVO> data2 = null;
List<dataVO> data3 = null;
List<dataVO> data4 = null;
data1 =  service.loadData(vo1);
data2 =  service.loadData(vo2);
data3 =  service.loadData(vo3);
data4 =  service.loadData(vo4);
 
result.add(data1.get(0));
result.add(data2.get(0));
result.add(data3.get(0));
result.add(data4.get(0));
cs

이런식으로 넣으려 할텐데

저러면 에러가 난다


result가 null이기 때문이다


이때


result를


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
List<dataVO> result = new ArrayList();
 
List<dataVO> data1 = null;
List<dataVO> data2 = null;
List<dataVO> data3 = null;
List<dataVO> data4 = null;
data1 =  service.loadData(vo1);
data2 =  service.loadData(vo2);
data3 =  service.loadData(vo3);
data4 =  service.loadData(vo4);
 
result.add(data1.get(0));
result.add(data2.get(0));
result.add(data3.get(0));
result.add(data4.get(0));
cs



이렇게


new ArrayList(); 로 선언해주면


에러없이 값이 잘 들어간다.

[kendo ui] treeView 선택된 노드 정보 가져오기




kendo ui에서 자주 쓰는 기능중 하나인 TreeView



맵형식의 데이터를 트리형식으로 시각화 해주는데 내가 회사에서 자주 사용하는 기능이다.


이떄 선택된 노드의 정보를 가져오는 방법에 대해서 알아보도록 하자




1. treeView에서 노드가 선택될때 이벤트를 주어서 현재 선택된 데이터를 가져오는 방법


1
2
3
4
5
6
7
8
9
10
11
$("#tree").kendoTreeView({
        dataSource : inlineDefault,
        dataTextField : "name",
        select : nodeSelect
    });
 
 
function nodeSelect(e) {
    var data = $("#tree").data('kendoTreeView').dataItem(e.node);
    console.log(data);
}
cs





위 코드와 같이 셀렉트 이벤트를 지정해 주면 된다.




2. 나중에 현재 선택되어져 있는 노드정보를 가져오는 방법



1
2
3
    var mytree = $("#tree").data("kendoTreeView");
    var selected = mytree.select();
    var selItem = mytree.dataItem(selected);
cs



아주 간단하다


끝이다!



+ Recent posts