Programming/node.js2019. 4. 23. 18:07

흐음.. 왜 안써지냐..

기본 예제로는 response.end(data) 식이었고..

얘는 response.write(data, endcoding); response.end(callback); 두개 문장으로 실행되는 유사한 효과를 준다는데

그럼 되는거 아닌가? ㅠㅠ

 

response.end([data][, encoding][, callback])#

History

This method signals to the server that all of the response headers and body have been sent; that server should consider this message complete. The method, response.end(), MUST be called on each response.

If data is specified, it is similar in effect to calling response.write(data, encoding) followed by response.end(callback).

If callback is specified, it will be called when the response stream is finished.

[링크 : https://nodejs.org/api/http.html#http_class_http_serverresponse]

 

 

+

으으 망할.. async 문제인가?

[링크 : https://teamtreehouse.com/community/error-write-after-end-3]

'Programming > node.js' 카테고리의 다른 글

node.js express 301 redirect  (0) 2019.05.15
node.js 항목 확인  (0) 2019.04.23
node.js 시그널 핸들링과 reload  (0) 2019.04.23
nodejs url param delete  (0) 2019.04.17
url 끝의 /  (0) 2019.04.17
Posted by 구차니
Programming/node.js2019. 4. 23. 13:31

process.on 으로 시그널 핸들러를 연결해두는 듯

 

var cluster = require('cluster');

console.log('started master with ' + process.pid);

//fork the first process
cluster.fork();

process.on('SIGHUP', function () {
  console.log('Reloading...');
  var new_worker = cluster.fork();
  new_worker.once('listening', function () {
    //stop all other workers
    for(var id in cluster.workers) {
      if (id === new_worker.id.toString()) continue;
      cluster.workers[id].kill('SIGTERM');
    }
  });
});

[링크 : https://joseoncode.com/2015/01/18/reloading-node-with-no-downtime/]

[링크 : http://zguide.zeromq.org/js:interrupt]

[링크 : https://stackoverflow.com/questions/20165605/detecting-ctrlc-in-node-js]

'Programming > node.js' 카테고리의 다른 글

node.js 항목 확인  (0) 2019.04.23
proxy error: Error: write after end  (0) 2019.04.23
nodejs url param delete  (0) 2019.04.17
url 끝의 /  (0) 2019.04.17
js array key 삭제하기  (0) 2019.04.16
Posted by 구차니
Programming/Java(Spring)2019. 4. 23. 10:19

maven 에서 repackging 이라는걸로 인해서 이렇게 바뀐다는데

file로 보면 war는 data과 war.original은 zip archive data 라고 되어있는데 무슨 차이인지 감이 안오네..

 

The answer is that you are using repackage goal in your spring-boot-maven-plugin. So, What it does?

Maven first builds your project and packages your classes and resources into a WAR (${artifactId}.war) file.

Then, repackaging happens. In this goal, all the dependencies mentioned in the pom.xml are packaged inside a new WAR (${artifactId}.war) and the previously generated war is renamed to ${artifactId}.war.original.

[링크 : https://stackoverflow.com/.../why-spring-boot-generate-jar-or-war-file-with-original-extention/43641913]

[링크 : https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html]

 

[링크 : http://repackage.org/]

 

Repackages existing JAR and WAR archives so that they can be executed from the command line using java -jar. With layout=NONE can also be used simply to package a JAR with nested dependencies (and no main class, so not executable).

[링크 : https://docs.spring.io/spring-boot/docs/current/maven-plugin/repackage-mojo.html]

 

[링크 : https://preamtree.tistory.com/69]

Posted by 구차니
Programming/Java(Spring)2019. 4. 18. 10:30

jcmd

[링크 : https://docs.oracle.com/javase/10/tools/jcmd.htm]

 

# jcmd --help
Error parsing arguments: No command specified

Usage: jcmd  PerfCounter.print|-f file>
   or: jcmd -l
   or: jcmd -h

  command must be a valid jcmd command for the selected jvm.
  Use the command "help" to see which commands are available.
  If the pid is 0, commands will be sent to all Java processes.
  The main class argument will be used to match (either partially
  or fully) the class used to start Java.
  If no options are given, lists Java processes (same as -p).

  PerfCounter.print display the counters exposed by this process
  -f  read and execute commands from the file
  -l  list JVM processes on the local machine
  -h  this help

 

근데 보는법을 모르겠다 ㅠㅠ

# jcmd 10776 help
10776:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help 

'.

# jcmd 10776 GC.heap_info
10776:
 PSYoungGen      total 192512K, used 187956K [0x00000000ec400000, 0x00000000f8300000, 0x0000000100000000)
  eden space 189952K, 98% used [0x00000000ec400000,0x00000000f7a0d258,0x00000000f7d80000)
  from space 2560K, 60% used [0x00000000f7d80000,0x00000000f7f00000,0x00000000f8000000)
  to   space 2560K, 0% used [0x00000000f8080000,0x00000000f8080000,0x00000000f8300000)
 ParOldGen       total 647168K, used 591782K [0x00000000c4c00000, 0x00000000ec400000, 0x00000000ec400000)
  object space 647168K, 91% used [0x00000000c4c00000,0x00000000e8de99b8,0x00000000ec400000)
 Metaspace       used 107438K, capacity 109826K, committed 110336K, reserved 1146880K
  class space    used 13031K, capacity 13457K, committed 13568K, reserved 1048576K

[링크 : http://karunsubramanian.com/websphere/how-to-monior-heap-usage-of-a-java-application/]

 

+

GPL 이라는데 상용으로 사용가능한지 모르겠음

[링크 : https://visualvm.github.io/]

 

 

+

클래스 히스토그램은.. 클래스별 메모리 사용량인가?

# jcmd 10776 GC.class_histogram
10776:

 num     #instances         #bytes  class name
----------------------------------------------
   1:        150865      436535528  [C
   2:          7008       47125920  [B
   3:        134955        4318560  java.util.concurrent.ConcurrentHashMap$Node
   4:        145517        3492408  java.lang.String
   5:         11226        3398488  [I

 

찾다보니 jmap -histo pid도 동일한 결과를 내주네..

[링크 : http://www.openkb.info/2014/06/how-to-check-java-memory-usage.html]

 

일단 의미를 보건대.. [C는 Char array 라는 느낌인데

무슨 미친 char 배열 객체가 이렇게 메모리를 쳐드시나...

Element Type        Encoding
boolean             Z
byte                B
char                C
class or interface  Lclassname;
double              D
float               F
int                 I
long                J
short               S 

 

it is an array of objects as specified by JVM Specifications for internal representation of class names:

  • a single [ means an array of
  • L followed by a fully qualified class name (e.g. java/lang/Object) is the class name terminated by semicolon ;

so [Ljava.lang.object; means Object[]

[링크 : https://stackoverflow.com/.../what-do-those-strange-class-names-in-a-java-heap-dump-mean]

 

+

[링크 : https://spring.io/blog/2015/12/10/spring-boot-memory-performance]

Posted by 구차니
Programming/node.js2019. 4. 17. 22:06

url 파라미트에서 특정 녀석을 삭제할 수 있는 기능

 

urlSearchParams.delete(name)#

Remove all name-value pairs whose name is name.

[링크 : https://nodejs.org/api/url.html#url_urlsearchparams_delete_name]

Posted by 구차니
Programming/node.js2019. 4. 17. 18:27

간단하게 말하면 / 가 붙으면 directory

없으면 file로 간주하고 그에 따라 행동이 달라진다는 내용

[링크 : https://djkeh.github.io/articles/Why-do-we-put-slash-at-the-end-of-URL-kor/]

 

근데.. 클라이언트나 서버에서 임의로 /를 붙여서 해석하다 보니

어떤곳에서는 /가 붙고 어떤것에서는 /가 안 붙는데

요즘에는 RESTful API에 의해서

/는 단순 구분자가 되었고

/api/stone/

/api/stone/apply

식으로 꼬리에 꼬리를 물게 구성가능하다 보니

기존의 디렉토리, 파일 구조로 캐싱하기 쉽지가 않다..

 

+

node.js 에서 끝에 /로 끝나는 것 찾기

[링크 : https://stackoverflow.com/questions/6165381/how-to-get-the-last-part-of-a-string-in-javascript/6165387]

Posted by 구차니
Programming/node.js2019. 4. 16. 18:21

'Programming > node.js' 카테고리의 다른 글

nodejs url param delete  (0) 2019.04.17
url 끝의 /  (0) 2019.04.17
크롬에서 "사용가능한 소켓 대기중" 상태표시줄 메시지  (0) 2019.04.16
proxy error: Error: write after end  (0) 2019.04.15
https cache proxy using node.js  (0) 2019.04.12
Posted by 구차니
Programming/node.js2019. 4. 16. 12:41

프록시 갈군다고 크롬으로 하다 보니.. 아래에서 자꾸 먼가 뜨는데

찾아보니.. 지금도 그런진 모르겠지만 크롬은 소켓 6개까지 열수 있다고

그래서 ajax 등으로 소켓이 닫히지 않으면 이런식으로 대기가 걸리는 고질적인 문제가 있다고 한다.

프록시에서 그럼 응답을 못 받으면 헤어나질 못하게 되는건가?

 

[링크 : https://dev18.tistory.com/35]

[링크 : https://dev.uhoon.co.kr/entry/waiting-for-available-sockets-사용-가능한-소켓-대기-중-에러-원인과-확인]

 

+

아래 링크로 가면 관리 페이지가 뜨긴 하는데 상세 소켓별 상태를 볼 수 있는건 아님

[링크 : chrome://net-internals/#sockets]

'Programming > node.js' 카테고리의 다른 글

url 끝의 /  (0) 2019.04.17
js array key 삭제하기  (0) 2019.04.16
proxy error: Error: write after end  (0) 2019.04.15
https cache proxy using node.js  (0) 2019.04.12
node.js mkdir -p 옵션 사용하기  (0) 2019.04.10
Posted by 구차니
Programming/node.js2019. 4. 15. 18:20

에러는 뜨는데 어떻게 해결해야 할지 감이 안오네..

 

[링크 : https://stackoverflow.com/questions/27769842/write-after-end-error-in-node-js-webserver]

Posted by 구차니
Programming/node.js2019. 4. 12. 17:10

제목만 거창해지고 있네 ㅋㅋ

fs.mkdirSync(path, {recursive:true}); 로 해보려는데

1개 까진 생성해도 2개 깊이는 생성이 안되서 mkdirp 라는 모듈을 사용해서 해결

(아니 그럼.. parent 생성기능이 안되는 거잖아?)

[링크 : https://www.npmjs.com/package/mkdirp]

 

그리고 request가 아니라 response를 해주어야 하는거라 저장용도로는 일단 되는 듯

이걸 어떻게 request에 묶어서 다시 보내주지?

+

context에서 clientresponse를 통해 보내면 되는 듯.

ctx.proxyToClientResponse.end('Hacked, you cannot proceed to the website');

[링크 : https://github.com/joeferner/node-http-mitm-proxy/blob/master/examples/preventRequest.js]

 

var Proxy = require('http-mitm-proxy');
var proxy = Proxy();
var path = require('path');
var url = require('url');
var { URLSearchParams } = require('url');
var decode = require('urldecode')
var mkdirp = require('mkdirp');

var fs = require('fs');
var idx = 0;
var chunks = [];

proxy.use(Proxy.wildcard);

proxy.onError(function(ctx, err) {
                console.error('proxy error:', err);
                });

proxy.onRequest(function(ctx, callback) {
                {
                ctx.use(Proxy.gunzip);
                var pback = ctx.clientToProxyRequest.url;

                var params = new URLSearchParams(url.parse(pback).query);
                params.sort();
                //console.log(url.parse(pback).pathname + '?' + decode(params.toString()));

                ctx.onResponseData(function(ctx, chunk, callback) {
                        chunks.push(chunk);
                        return callback(null, chunk);
                        });
                }

                ctx.onResponseEnd(function(ctx, callback) {
                                //  console.log('REQUEST END', (Buffer.concat(chunks)).toString());
                                console.log('REQUEST END');
                                // console.log(path.basename(oriname.pathname))
                                // console.log(path.dirname(oriname.pathname))

                                var oriname = url.parse(ctx.clientToProxyRequest.headers.host + ctx.clientToProxyRequest.url)
                                var dirname = 'save/' + path.dirname(oriname.pathname) + '/';
                                var filename = path.basename(oriname.pathname) + idx;
                                //              idx++;
                                console.log(dirname);
                                console.log(filename);
                                mkdirp.sync(dirname);
                                fs.writeFileSync(dirname + filename, Buffer.concat(chunks));
                                chunks = [];
                                return callback();
                                });
                return callback();
});

proxy.onCertificateRequired = function(hostname, callback) {
        return callback(null, {
keyFile: path.resolve('/ca/certs/', hostname + '.key'),
certFile: path.resolve('/ca/certs/', hostname + '.crt')
});
};
proxy.listen({port: 3128});

 

 

 

[링크 : https://www.npmjs.com/package/http-mitm-proxy]

Posted by 구차니