'javascript'에 해당되는 글 24건

web/node.js

sequelize에서 alias 사용하여 검색하는 방법

sequelize에서 검색을 할 때 alias를 줘서 검색하는 방법은 다음과 같다. 

생각보다 간단하다.


1
2
3
await This.User.findOne({
  attributes: ['id', ['name''userName']] //id, first AS firstName
});
cs


web/node.js

sequelize에서 timezone 설정 추가

sequelize를 통해 datetime 필드에 값을 삽입해봤을 때 계속해서 값이 UTC 시간대로 들어가게 되었다.


그래서 해당 블로그(http://ggamu.com/81)에서 제공하는 방식대로 database 자체에 timezone을 서울로 변경하였다.


하지만 그래도 계속해서 값이 UTC로 들어갔고 그래서 혹시 몰라 삽입하는 코드에 new Date('2018-10-18 11:11:11').toLocalString()를 설정해줬다.


하지만 그래도 역시나 ㅜㅜ 

그래서 sequelize 라이브러리 자체에 설정을 하는 부분이 있는지 싶어서 확이해봤는데, 설정 자체에 timezone을 설정하는 부분이 있었다.


그래서 sequelize 객체를 만들때 사용하는 option에 timezone옵션을 부여해줬다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "user": "root",
  "password": "dbsafer00",
  "database": "oauth2",
  "options": {
    "host": "127.0.0.1",
    "dialect": "mysql",
    "timezone": "+09:00",
    "define": {
      "charset": "utf8mb4",
      "dialectOptions": {
        "collate": "utf8mb4_general_ci"
      }
    },
    "pool": {
      "min": 0,
      "max": 10,
      "idle": 10000,
      "acquire": 10000
    }
  }
}
cs


그랬더니 정상적으로 timezone에 맞게 입력되었다.

이런 타임존 문제 때문에 epoch_second를 삽입해서 자주 사용한다. 


바꿔서 진행하던지 해야겠다 ㅜ

web/node.js

node js에서 stream pipe 사용시 에러 처리 방법

node js에서 데이터를 stream을 사용하여 처리하고 pipe를 사용해서 계속해서 stream을 가지고 작업을 이어나갈 수 있다. 그런데 pipe를 통해서 작업을 진행하다 보니까 중간에 오류가 발생했을 때 try / catch 로는 정상적으로 처리하지 못하는 경우가 발생했다. 

나에 경우에는 에러가 발생했을 때 try / catch에서 잡히지 않아서 프로그램이 Unhandled Promise Rejections를 출력 하며 죽어버렸다.

그 예는 다음과 같이 request를 통해서 받은 이미지를 sharp 라이브러리를 통해서 이미지 크기를 변경하려고 할 때 발생했다.

1
try {
await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_main08061242.jpg').pipe(transformer).pipe(writeStream);
} catch (e) {
console.error(e);
}
cs


그래서 이를 처리하기 위해서 알아봤는데 각 파이프라인에서 발생하는 에러를 처리하기 위해서는 try/catch로만 잡을 수가 없다. 그래서 이를 해결하기 위해서 각 파이프 앞단에서 error 이벤트를 잡는 설정을 해줘야한다.


1
2
3
4
5
6
7
8
// 파일로 쓰기
await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_main08061242.jpg').on('error', function (e) {
  console.error(e);
}).pipe(transformer).on('error', function (e) {
  console.error(e);
}).pipe(writeStream).on('error', function (e) {
  console.error(e);
});
cs


하지만 이렇게만 하면 에러는 잡을 수 있어도 pipe에서 행이 걸리는 경우가 발생된다. 그래서 에러가 발생했을 때 행 걸리지 않고 다음 로직으로 정상적으로 처리되도록 하기 위해서는 this.emit('end')를 넣어줘야 한다.


1
2
3
4
5
6
7
8
9
10
11
// 파일로 쓰기
await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_main08061242.jpg').on('error', function (e) {
  console.error(e);
  this.emit('end');
}).pipe(transformer).on('error', function (e) {
  console.error(e);
  this.emit('end');
}).pipe(writeStream).on('error', function (e) {
  console.error(e);
  this.emit('end');
});
cs


참고

https://stackoverflow.com/questions/21771220/error-handling-with-node-js-streams


데이터베이스/Elasticsearch

Elasticsearch query string 조회시 parse exception 에러 처리

elasticsearch에서 query_string로 데이터 조회시에 쿼리문으로 ) 특수문자가 포함하여 조회했다. 하지만 다음과 같이 문제가 발생했다.


1
2
3
4
5
6
7
8
9
10
11
{
  "error": {
    "root_cause": [
      {
        "type": "parse_exception",
        "reason": "parse_exception: Encountered \" \")\" \") \"\" at line 1, column 11.\nWas expecting one of:\n    <EOF> \n    <AND> ...\n    <OR> ...\n    <NOT> ...\n    \"+\" ...\n    \"-\" ...\n    <BAREOPER> ...\n    \"(\" ...\n    \"*\" ...\n    \"^\" ...\n    <QUOTED> ...\n    <TERM> ...\n    <FUZZY_SLOP> ...\n    <PREFIXTERM> ...\n    <WILDTERM> ...\n    <REGEXPTERM> ...\n    \"[\" ...\n    \"{\" ...\n    <NUMBER> ...\n    "
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
cs


확인해보니 + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ / 포함된 문장을 query_string 통해서 조회하려고 하면 에러를 발생시킨다. 그래서 이를 해결하기 위해서 위에 reserved character들이 들어간 단어는 \\를 붙여주어야 한다.


이를 위한 자바스크립트는 다음과 같다.

1
2
3
async escapeReservedCharacter(query) {
  return query.replace(/([!*+&|()<>[\]{}^~?:\-="/\\])/g, '\\$1');
}
cs


이를 해결해서 query_string을 사용하면 문제가 해결된다.


참고 : https://stackoverflow.com/questions/26431958/escaping-lucene-characters-using-javascript-regex




web/node.js

node.js express에서 request 사용자 아이피 찾기

요청한 사용자의 Ip를 찾아서 로그를 남기거나 Ip 지역정보를 활용해서 geoIp를 찾아내거나 할 때 request를 요청한 사용자의 IP 주소가 필요하다.


Spring에서는 간단하게 HttpServletRequest에서 getHeader의 X-FORWARDED-FOR에 있는 정보를 가져오거나 getRemoteAddr()을 통해 가져올 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 주문요청.
 *
 * @param req the req
 * @return the response entity
*/
@PostMapping(value = "/order")
public ResponseEntity<?> order(@Valid @RequestBody OrderRequestDto req, HttpServletRequest request) {
    String ip = request.getHeader("X-FORWARDED-FOR");
    if (ip == null)
        ip = request.getRemoteAddr();
 
    return ResponseEntity.ok(orderService.order(req));
}
cs


우선 헤더에서 X-FORWARDED-FOR에서 왜 아이피 정보를 찾는건가? 대부분의 사용자 요청이 오면 사용자 요청은 Load Balance등을 통해서 오게되기 때문에 원천 아이피를 찾을 수 없기 때무에 X-FORWARDED-FOR에 원천 아이피를 넣어서 전송한다.

결론은 XFF는 HTTP Header 중 하나로 HTPP Server에 요청한 Client의 IP를 식별하기 위한 표준이다.

참고 : http://blog.plura.io/?p=6597


그럼 node.js에서는 어떻게 가져와야 하나? 아주 간단하다.

1
const ip = req.headers['x-forwarded-for'||  req.connection.remoteAddress;
cs


그리고 만약 로컬에서 ::1로 사용자 IP가 출력되는 경우가 있다. ::1은 IpV6에서 로컬 호스트를 의미한다. 그래서 express 서버를 생성할 때 IPV4를 사용하도록 설정하면 된다.


 [ 1 ]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ] 

푸터바

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

  • Today : 41
  • Yesterday : 627
  • Total : 55,492