nodejs package.json의 모듈 업데이트 하기!

npm-check-updates을 이용하여 package.json에 등록된 모듈들을 의존성에 알맞게 최신 버젼으로 업데이트 할 수 있다.

설치 후 실행은 다음과 같다.

# global로 npm-check-updates 설치
$> npm i -g npm-check-updates
# 프로젝트(package.json과 동일한) 디렉토리에서 다음 명령어 실행
$> ncu -u
Upgrading /Users/admin/myProject/package.json
[====================] 17/17 100%

 app-root-path     ^2.1.0  →   ^2.2.1
 cookie-parser     ~1.4.3  →   ~1.4.4
 debug             ~2.6.9  →   ~4.1.1
 dotenv            ^7.0.0  →   ^8.0.0
 express          ~4.16.0  →  ~4.16.4
 express-session  ^1.15.6  →  ^1.16.1
 helmet           ^3.16.0  →  ^3.17.0
 http-errors       ~1.6.2  →   ~1.7.2
 morgan            ~1.9.0  →   ~1.9.1
 puppeteer        ^1.13.0  →  ^1.15.0

Run npm install to install new versions.

# 업데이트된 결과를 설치
$> npm install

자주는 아니더라도, 가끔씩은 모듈을 업데이트 하자!

참고자료

Posted by lahuman

댓글을 달아 주세요

nodejs port forwarding 처리

https를 설정하고 나니, 기존 80 포트로 요청이 있을 경우, 443으로 redirect 하는 방법을 찾아보았다.

구글을 확인해보니, 다음과 같이 쉽게 처리 할 수 있었다.

// Redirect from http port 80 to https
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
    res.end();
}).listen(80);

구글과 함께면 뭐든 쉽다.

참조 링크

Posted by lahuman

댓글을 달아 주세요

puppeteer에서 POST로 요청 날리기

puppeteer에서 request를 POST로 요청 하기 위해서는 다음과 같은 설정을 해야 합니다.

await page.setRequestInterception(true);
// create a flag to only modify the initial request
let reformatFirstRequest = true;

page.on('request', interceptedRequest => {
  if (reformatFirstRequest) {
    console.log('first-request');
    reformatFirstRequest = false;
    interceptedRequest.continue({
      method: 'POST',
      postData: JSON.stringify(data),
      headers: { 'Content-Type': 'application/json' }
    });
  } else {
    interceptedRequest.continue();
  }
});

interceptedRequest 를 한번만 하지 않으면 이후 해당 request에 대한 404 오류가 떨어질 수 있다.

끗~

참고 자료

Posted by lahuman

댓글을 달아 주세요

web push 구현하기

web push를 구현하기 위해서 web-push라는 모듈을 사용해야 한다.

구현 방법은 Sending Web Push Notifications from Node.js을 참고 하면 된다.
(추후 시간을 내어 코드를 정리해보려고 한다.)

오늘은 일단 중요한 몇가지 사항을 공유 하려고 한다.

  1. windows에서는 알람을 활성하 해두어야 알람을 받을 수 있다.
  2. 실제 서비스는 https만 가능하며, 인증서 또한 공식 인증서를 이용해야 된다.
  3. subscription 정보를 잘 관리 하면 계속 상대방이 차단하기 전까지 계속 알람을 보낼 수 있다.
  4. 동작 원리는 worker를 등록하여 상대방에게 push를 한다.

일단 오늘은 여기까지!!!

참조 링크

Posted by lahuman

댓글을 달아 주세요

얼마전 Node에서 비동기 처리를 순서대로 처리해야 하는 일이 있었다.

구글을 검색하다 async.waterfall in a For Loop in Node.js을 찾았다.

var async = require("async")
var users = []; // Initialize user array or get it from DB

async.forEachLimit(users, 1, function(user, userCallback){

    async.waterfall([
        function(callback) {
            callback(null, 'one', 'two');
        },
        function(arg1, arg2, callback) {
            // arg1 now equals 'one' and arg2 now equals 'two'
            callback(null, 'three');
        },
        function(arg1, callback) {
            // arg1 now equals 'three'
            callback(null, 'done');
        }
    ], function (err, result) {
        // result now equals 'done'
        console.log('done')
        userCallback();
    });


}, function(err){
    console.log("User For Loop Completed");
});

asyncasync, await인줄 알았는데, 비동기 처리에 사용하는 모듈 이었다.

70 여 가지 모듈을 지원하며, 예제도 잘 나와 있다.

이중 제어 관련하여 다음의 매소드 등이 제공된다.

  1. XXXLimit : 한번에 처리 하는 Worker 갯수 지정
  2. XXXSeries : 한개씩 처리
  3. waterfall : 여러 비동기 처리를 순차적으로 처리
  4. parallel : 콜렉션을 병렬 처리
  5. apply : 인수 처리
  6. map : 새로운 컬렉션을 생성

이 외에도 많은 기능이 제공된다.

Async provides around 70 functions that include the usual 'functional' suspects (map, reduce, filter, each…) as well as some common patterns for asynchronous control flow (parallel, series, waterfall…). All these functions assume you follow the Node.js convention of providing a single callback as the last argument of your asynchronous function -- a callback which expects an Error as its first argument -- and calling the callback once.

비동기 처리를 할때 사용하면 상당히 유용하다.

참고 자료

Posted by lahuman
TAG async, nodejs

댓글을 달아 주세요

Express에서 post호출 시 request의 body에서 undefined가 발생한다.

다음과 같이 호출 했는데 결과가 undefined일 경우는 body-parser를 설정하지 않아서 이다.

# post 호출시, body에 {test:'hello"} 를 함께 전송

#router 소스
router.post('/', (req, res) => {
  console.log(req.body); undefined 발생
  res.redirect('/');
});

처리 방법은 body-parser를 express에서 사용하도록 설정 하면된다.

# body-parser 설치
$> npm install --save body-parser

#app.js 소스
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser().json()); //bodyparser 사용 설정

이후 만나는 문제는 body의 크기가 크다는 오류를 만난 수 있다. 이때는 body의 크기를 옵션 설정하면 된다.

const bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'})); //body 의 크기 설정
app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); //url의 크기 설정

추가로 express 4.16부터는 body-parser를 포함 하고 있다.

const express = require('express')
const app = express();
app.use(express.json())
app.post('/', (req, res) => {
  console.log(req.body)
})

알아두자

참고 자료


Posted by lahuman

댓글을 달아 주세요

Node 모듈 설치시 오류시 해결 방법

node 버젼이 변경된 상태에서 npm install을 하면, 오류가 발생하는 경우가 있다.

이럴때 해결 방법은 정말 단순 하다.

해당 모듈을 삭제 하고 재설치 한다.

npm install
#oracle-db 모듈 오류발생

#oracle-db 모듈 삭제
npm uninstall oracle-db

#oracle-db 모듈 설치
npm install --save oracle-db

컴터 동작이 이상하면 재기동 하면 되듯이, 모듈도 재설치 하면된다.


Posted by lahuman

댓글을 달아 주세요

pm2 cluster mode 특징

NodeJS 2019. 2. 6. 16:29

pm2 cluster mode에서는 session이나 websocket이 동작 하지 않는다.

pm2에서 제공하는 클러스터 모드는 코드의 수정 없이 CPU를 확장할 수 있다. Node.js 클러스터 모듈을 사용하여 확장 된 응용 프로그램의 하위 프로세스가 자동으로 서버 포트를 공유 하도록 하는 기능이다.

사용법은 다음과 같다.

# -i 옵션이 cluster 모드이며, max는 사용할 CPU 수를 입력 하면 된다.
# 0을 입력하면, 자동으로 모든 CPU 숫자만큼 클러스터가 생성된다.
pm2 start app.js -i max

또는 js/yaml/json 파일을 통해서 설정을 할 수 있다.

{
  "apps" : [{
    "script"    : "api.js",
    "instances" : "max",
    "exec_mode" : "cluster" 
  }]
}

Cluster Mode를 사용하면 가장 중요한게 stateless application이 된다는 것이다.

이 상태에서는 가중 중요한게 로컬 데이터 저장소를 프로세스에서 사용할수 없다는 것이다. 사용을 하고 싶으면, connect-redis과 같은 프로그램을 이용하면 된다.

Session이 동작하지 않아서 한참 해멧다.

참고자료


Posted by lahuman

댓글을 달아 주세요

Vuejs 배포시 route 동작 처리

vuejs에서 express로 배포하는 방식을 기존에 설명 했었다.

문제는 vuejs route에 주소를 직접 치고 들어가면 404 오류가 발생하였다.

express쪽에서 기본적인 요청은 vuejs의 route를 바라보게 하고 싶어서 검색을 해보니, Routes not working in production라는 글을 확인 하였다.

처리 방법은 express에 마지막 부분에 다음 코드를 추가 하면 된다. index.html은 vuejs를 배포한 위치이다.

app.get('*', (req, res) => {
  res.sendFile(`${__dirname}/public/index.html`);
});

vuejs도 잼나네!

참고 자료


Posted by lahuman

댓글을 달아 주세요

How To Use Winston to Log Node.js Applications

간단하게 설정만 작성하는 것으로 원본자료 How To Use Winston to Log Node.js Applications을 보세요.

var appRoot = require('app-root-path');
var winston = require('winston');

// define the custom settings for each transport (file, console)
var options = {
  file: {
    level: 'info',
    filename: `${appRoot}/logs/app.log`,
    handleExceptions: true,
    json: true,
    maxsize: 5242880, // 5MB
    maxFiles: 5,
    colorize: false,
  },
  console: {
    level: 'debug',
    handleExceptions: true,
    json: false,
    colorize: true,
  },
};

// instantiate a winston.createLogger with the settings defined above
var logger = winston.createLogger({
  transports: [
    new winston.transports.File(options.file),
    new winston.transports.Console(options.console)
  ],
  exitOnError: false, // do not exit on handled exceptions
});

// create a stream object with a 'write' function that will be used by `morgan`
logger.stream = {
  write: function(message, encoding) {
    // use the 'info' log level so the output will be picked up by both transports (file and console)
    logger.info(message);
  },
};

module.exports = logger;

요렇게 설정만 해놓아도 기본으로 사용이 가능하다.

추가로 알게된 App Root Path Module 도 꽤 유용해보인다.

app의 root path를 제공하여 다음과 같이 사용할 수 있다.

#1 
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');

#2
var reqlib = require('app-root-path').require;
var myModule = reqlib('/lib/my-module.js');

#3
// In app.js
global.reqlib = require('app-root-path').require;
 
// In lib/module/component/subcomponent.js
var myModule = reqlib('/lib/my-module.js');

#4
var myModulePath = require('app-root-path').resolve('/lib/my-module.js');

좋은게 많은데 몰라서 못쓴다.

공부 많이 좀 해야겠다. 요즘 게을러져서 공부도 안하고 그냥 날로 먹을라고 한다.

참고 자료


Posted by lahuman

댓글을 달아 주세요