Error generating response. ParseError {
code: 135,
message: 'at least one ID field (deviceToken, installationId) must be specified in this operation' }
Error generating response. ParseError {
code: 137,
message: 'A duplicate value for a field with unique values was provided' }
갑자기 생겨난 원인을 찾기 힘든 parse error 메시지.
마이그레이션 하고 나서 개발자들이 테스트 하다가 이 모양이 됐다.
135 error 는 deviceToken 이나 installationId 가 payload 에 있어야 하는데 없다는 얘기 같고. 그래도 뭔소린지 모르겠고..
(deviceToken 이랑 installationId 가 둘다 값이 없는 데이터는 한 개도 없음.)
137 error 는 unique 컬럼에 중복 값이 있다는 오류 같고.
(이것도 검색 결과 나오지 않았음.)
아 놔 에러 메시지가 친절히 나와도 이거 당최 알 수가 없네.
일단 deviceToken 을 살펴보니 테스트들 한답시고 test 와 123456... 이런 문자들이... ㅋㅋ 줸장!
mongoDB 에서 문자의 길이가 64자 미만의 deviceToken 값들을 찾아봤다.
db.getCollection('_Installation').find({$where: "this.deviceToken.length < 64"}).limit(10); | cs |
Error: error: {
"$err" : "TypeError: Cannot read property 'length' of undefined\n at _funcs2 (_funcs2:1:46) near '64' ",
"code" : 16722
}
undefined 값들의 길이를 구할 수 없다는 에러가 ㅋㅋ;
토큰이 빈건 또 뭐여...
db.getCollection('_Installation').find({deviceToken: {$exists: true}, $where: "this.deviceToken.length < 64"}) | cs |
조회하고 삭제. (find -> remove 대체.)
이렇게 했는데도 push 가 반절은 발송되지 않았다. unique 컬럼을 찾아봤다.
db.getCollection('_Installation').getIndexes() | cs |
unique 키는 installationId_1 이랑 installationId_1_deviceToken_1.
중복값을 체크해 봤다.
db.getCollection('_Installation').aggregate([ {$group : {_id : "$deviceToken", count : {$sum : 1}}}, {$match : {count : {$gt : 1}}} ]) db.getCollection('_Installation').aggregate([ {$group : {_id : "$installationId", count : {$sum : 1}}}, {$match : {count : {$gt : 1}}} ]) | cs |
중복값은 없다;
deviceToken 과 installationId 가 마이그레이션 후에 undefined 로 들어간게 2천개 가량 있는데 이 부분이 약간 의심스러움. SDK 문제인지...
index 까지 완전 동일한 테스트 서버에서는 undefined 백개 있어도 잘 보내짐 ㅜㅜ
운영서버는 push 보내려면 또 한 달을 기다려야 하고... 아~ 짜증난다...
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.