GyuHa.com


1. app.js 에서 하단에 입력

//스케줄 잡 설정
const Schedule = require('./schedule/scheduleJob');
let schedule = new Schedule();
schedule.start();


2. 최상단에 schedule 폴더 생성 및 scheduleJob.js 파일 생성

3. scheduleJob.js 파일내용

'use strict';

const cron = require("node-cron");
var dateFormat = require('dateformat');
// schedule tasks to be run on the server

class investMail {

constructor() {
this.id = 'id_1';
}

start() {
cron.schedule('* * * * *', () => {
var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");
console.log(day + ' running a task every minute');
});
}

}

module.exports = investMail;

cron.schedule('* * * * *', () => {

1분에 한번씩 진행 하라는 부분임.


Comment +0


가상 도메인으로 nodejs 설정 방법

<VirtualHost *:80>

        # The ServerName directive sets the request scheme, hostname and port that

        # the server uses to identify itself. This is used when creating

        # redirection URLs. In the context of virtual hosts, the ServerName

        # specifies what hostname must appear in the request's Host: header to

        # match this virtual host. For the default virtual host (this file) this

        # value is not decisive as it is used as a last resort host regardless.

        # However, you must set it for any further virtual host explicitly.

        

        ServerName www.example.com

        ServerAdmin webmaster@localhost

        DocumentRoot /home/user/node소스 폴더


        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,

        # error, crit, alert, emerg.

        # It is also possible to configure the loglevel for particular

        # modules, e.g.

        #LogLevel info ssl:warn


        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined


        # For most configuration files from conf-available/, which are

        # enabled or disabled at a global level, it is possible to

        # include a line for only one particular virtual host. For example the

        # following line enables the CGI configuration for this host only

        # after it has been globally disabled with "a2disconf".

        #Include conf-available/serve-cgi-bin.conf

ProxyRequests off

<Proxy *>

  Order deny,allow

  Allow from all

</Proxy>


<Location />

      ProxyPass http://localhost:3000/

  ProxyPassReverse http://localhost:3000/

</Location>


</VirtualHost>


Comment +0

파일로 생성해서 사용중

app.js 위치에 util 폴더 생성 후 sendmail.js파일 생성

var fs = require('fs');

var sendMail = {
// gmail을 이용한 메일 발송
gmail: function(from,to,subject,fname,params){

fs.readFile(__dirname + '/../email/' + fname, function(err, html){ //최상위 email 폴더 기준으로 스킨을 선택.

if(err){
console.log(err);
}else{
var toHtml = new String(html);

var nodemailer = require('nodemailer');
var transport = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: '구굴아이디'
pass: '구굴패스워드'
}
});
var mailOptions = {
'from': from,
'to': to,
'subject': subject,
'html': toHtml
};

transport.sendMail(mailOptions, function(error, response){
if (error){
console.log(error);
} else {
console.log("Message sent : " + response.message);
}

transport.close();
});
}
});
},
//aws 메일 발송 (테스트 필요)
awsMail: async function(from, to, subject, fname, params) {

await fs.readFile(__dirname + '/../email/' + fname, function(err, html){

var toHtml = html.toString();
toHtml = toHtml.replace('{href}', params.url); //치환필요시 사용

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
host: config.awsEmailHost,
port: config.awsEmailPort,
secure: true,
auth: {
user: config.awsEmailId,
pass: config.awsEmailPw
}
}));
var mailOptions = {
from: from, // sender address
to: to, // list of receivers
subject: subject, // Subject line
text: '', // plaintext body
html: toHtml // html body
};
transport.sendMail(mailOptions, function(error, info) {
if (error) {
console.log(error);
} else {
console.log('Message sent: ' + info.response);
}
});
});
}
}

module.exports = sendMail;


필요한 곳에서 선언

const sendMail = require('../util/sendmail');


// 메일 발송 처리
var mailParams = {
'emailSubject' : 'TEST 메일 발송', //메일 제목
'emailFormNm' : "testSend.html", //메일 스킨 파일명
'userEmail' : 'admin@gyuha.com', //대상자 메일
'url' : 'http://www.naver.com', //내용중 변경필요한 파라메터 설정
'emailSendMsg' : '종료 후 전달 메시지'
}

sendMail.awsMail('발송이메일', '받는이메일', mailParams.emailSubject, mailParams.emailFormNm, mailParams);


콜백이 필요하면 응용해서 사용해 보시길....

Comment +0

express mariaDB 및 mysql 접속 정보 

var connection = mysql.createPool({
host : '127.0.0.1',
user : 'user id',
password: 'user password',
port : '3306',
database: 'db명',
connectTimeout : 20000,//접속타임아웃 시간
debug : false, //디버그 모드
multipleStatements: true, //다중 쿼리 실행
supportBigNumbers: true, //decimal 타입등 지원
bigNumberStrings: true //decimal 타입등 지원
});


multipleStatements 사용시 다중 쿼리를 세미콜론으로 분리해서 처리 할 수 있다.

예)

var sql = `select * from table;`;

     sql += `select * from table2;';

connection.query(sql, callback);

connection.release();


callback함수에서 받을시에는 Array로 받아짐.

test( function(err, row) {

console.log(JSON.stringify(row))

row[0] --> 첫번째 쿼리 실행 데이터

row[1] --> 두번째 쿼리 실행 데이터

});

물론 CURD 모두 가능함.

Comment +0

1. pm2 설치(ubuntu, Mac)

sudo npm install pm2@latest -g    


2. app.js 파일 위치에 myapp.config.js 파일 생성

module.exports = {
apps: [
{
// pm2로 실행한 프로세스 목록에서 이 애플리케이션의 이름으로 지정될 문자열
name: "http://www.domain.co.kr",
// pm2로 실행될 파일 경로
script: "./bin/www",
// 운영환경시 적용될 설정 지정
env: {
"PORT": 3000,
"NODE_ENV": "production"
}
}
]
};

name :  프로세스목록에서 보여질 이름을 지정한다. (도메인으로 하면 좋을듯...)

3. 실행하기

pm2 start myapp.config.js

아래 로그 출력 됨.

[PM2] Spawning PM2 daemon with pm2_home=/home/ubuntu/.pm2

[PM2] PM2 Successfully daemonized

[PM2][WARN] Applications http://www.domain.co.kr not running, starting...

[PM2] App [http://www.domain.co.kr] launched (1 instances)

┌─────────────────────────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬────────┬──────────┐

App name                    id version mode pid   status restart uptime cpu mem       user   watching

├─────────────────────────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼────────┼──────────┤

http://www.domain.co.kr     0.0.0   fork 12614 online 0       0s     0%  23.2 MB   ubuntu disabled

└─────────────────────────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴────────┴──────────┘

 Use `pm2 show <id|name>` to get more details about an app


4. 중지하기

$ pm2 stop. myapp.config.js


[PM2] [http://www.domain.co.kr](0) ✓

┌─────────────────────────────┬────┬─────────┬──────┬─────┬─────────┬─────────┬────────┬─────┬────────┬────────┬──────────┐

App name                    id version mode pid status  restart uptime cpu mem    user   watching

├─────────────────────────────┼────┼─────────┼──────┼─────┼─────────┼─────────┼────────┼─────┼────────┼────────┼──────────┤

http://www.domain.co.kr.     0.0.0   fork 0   stopped 0       0      0%  0 B    ubuntu disabled

└─────────────────────────────┴────┴─────────┴──────┴─────┴─────────┴─────────┴────────┴─────┴────────┴────────┴──────────┘

 Use `pm2 show <id|name>` to get more details about an app


5. 재시작 하기

$ pm2 restart. myapp.config.js


[PM2] Applying action restartProcessId on app [http://www.domain.co.kr](ids: 0)

[PM2] [http://www.domain.co.kr](0) ✓

┌─────────────────────────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬────────┬──────────┐

App name                    id version mode pid   status restart uptime cpu mem       user   watching

├─────────────────────────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼────────┼──────────┤

http://www.domain.co.kr.     0.0.0   fork 12693 online 1       0s     0%  17.7 MB   ubuntu disabled

└─────────────────────────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴────────┴──────────┘

 Use `pm2 show <id|name>` to get more details about an app


터미널을 종료해도 운영은 계속....

Comment +0


배열 처리시 첫번째 값에 대한 검증만 처리 되므로 확장 부분을 추가하면 나머지 기능도 처리 함.

<input type="text" name="test[]">

<input type="text" name="test[]">

<input type="text" name="test[]">

<input type="text" name="test[]">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"></script>
<script>
$("#form id").validate({
errorElement: "div",
wrapper: "div",
errorPlacement: function(error, element) {
offset = element.offset();
error.insertAfter(element);
error.css('color','red');
},
rules: {
'test[]' : {required: true}
},
messages:{
'test[]':{
required:"내용을 입력해 주세요"
}
}
});

//확장판 name[] 처리
$.extend( $.validator.prototype, {
checkForm: function () {
this.prepareForm();
for (var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++) {
if (this.findByName(elements[i].name).length != undefined && this.findByName(elements[i].name).length > 1) {
for (var cnt = 0; cnt < this.findByName(elements[i].name).length; cnt++) {
this.check(this.findByName(elements[i].name)[cnt]);
}
} else {
this.check(elements[i]);
}
}
return this.valid();
}
});
</script>


node.js (express) 에서 request 받을시에는 req.body['test[]']로 받으면 배열로 받아짐.


Comment +0

express를 이용한 첨부파일 암호화 및 S3 업로드

1. router POST 업로드 호출 후


var s3 = require('../util/awsFileUpload')

router.post('/fileupload', function(req, res, next){
s3.encUpload(req, res, function(err, result){
if(err){
res.send('error').end();
} else {
res.send('success image file').end();
}
})

});


awsFileUpload.js 파일

let multer = require('multer')
var storage = multer.memoryStorage()
const upload = multer({storage: storage, limits: { fileSize: 10 * 1024 * 1024 }})
let AWS = require('aws-sdk')
var cryptoFile = require('../util/crypto')

AWS.config.loadFromPath(__dirname + '/../config/awsconfig.json')
let s3 = new AWS.S3()

var s3Upload = {

encUpload : function(req, res, callback) {

var uploads = upload.single('uploadfile');
uploads(req, res, function(err){
var file = req.file;
file.buffer = cryptoFile.buffercipher(file.buffer);
var fileName = new Date().valueOf() +".enc";
var params = {
Bucket: '버킷명',
Key: fileName,
Body: file.buffer,
ACL: 'public-read', // your permisions
};
s3.putObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
callback(err, data);
});

});
}
}
module.exports = s3Upload


crypto.js

var crypto = require('crypto')
var multer = require('multer')
const fs = require('fs');

var key = new Buffer('암호화키', 'hex');

const cipher = crypto.createCipher('aes-256-cbc', key)
const decipher = crypto.createDecipher('aes-256-cbc', key)

var cryptoUtil = {

    buffercipher: function(bufferData) {
        var base64 = bufferData.toString('base64')
        var enData = cipher.update(base64);
        return enData;
    },

    s3decipher: function(data) {
        var binary = new Buffer(data,'base64')
        var decrypted = decipher.update(binary, 'binary', 'utf8')

        return decrypted;
    },

}

module.exports = cryptoUtil;


awsconfig.json  S3 키발급

{
"accessKeyId": "accessKey",
"secretAccessKey": "secret키",
"region": "지역"
}


Comment +0

java jdk별 다운로드




Comment +0