#nodejs

array.forEach 함수의 활용

forEach()는 오름차순으로 배열에 있는 각 요소에 대해 한 번씩 callback을 실행한다.
삭제 또는 비초기화된 인덱스 속성에 대해서는 호출되지 않는다.

callback은 다음 세 인수와 함께 호줄된다.
요소 값, 요소 인덱스, 순회될 배열

받아온 rows를 forEach 함수를 사용하여 정체

정제하는 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function(err,rows){
var result = [];
var indexObject = {};
if(err){
console.log(err)
}else{
rows.forEach(function(row){

<!-- 해당 행의 id가 indexObject의 키값에 없을때 실행 -->
if(!(row.id in index)){
index[row.id]={
id: row.id,
name: row.name
};

<!-- 반환값에 추가 -->
result.push(index[row.id]);
}
해당 행이 인덱스에 있건 없건 간에 해당 인덱스의 내역을 체워줌
index[row.id].histories.push({
historyId:row.historyId,
historyName:row.historyName
});
})
console.log(result);
}
}

swagger-ui-express 설치하기

1
npm i swagger-ui-express

package.json에 swagger-ui-express 추가하기

1
"swagger-ui-express": "latest" // or desired version

swagger js-doc 설치하기

기존에 있던 js 파일에서 api를 따오기 위해 swagger jsdoc을 설치한다.

1
npm install swagger-jsdoc --save

swagger-jsdoc 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var swaggerJSDoc = require('swagger-jsdoc');

var options = {
swaggerDefinition: {
info: {
title: 'Hello World', // Title (required)
version: '1.0.0', // Version (required)
},
},
apis: ['./routes.js'], // Path to the API docs
};

// Initialize swagger-jsdoc -> returns validated swagger spec in json format
var swaggerSpec = swaggerJSDoc(options);

app.js 세팅하기

1
2
3
4
5
6
const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerSpec = swaggerJSDoc(options)

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));

document the api

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* @swagger
* /login:
* post:
* description: Login to the application
* produces:
* - application/json
* parameters:
* - name: username
* description: Username to use for login.
* in: formData
* required: true
* type: string
* - name: password
* description: User's password.
* in: formData
* required: true
* type: string
* responses:
* 200:
* description: login
*/
app.post('/login', function(req, res) {
res.json(req.body);
});

Model Definition을 통한 재사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* @swagger
* definitions:
* NewUser:
* type: object
* required:
* - username
* - password
* properties:
* username:
* type: string
* password:
* type: string
* format: password
* User:
* allOf:
* - $ref: '#/definitions/NewUser'
* - required:
* - id
* - properties:
* id:
* type: integer
* format: int64
*/

/**
* @swagger
* /users:
* get:
* description: Returns users
* produces:
* - application/json
* responses:
* 200:
* description: users
* schema:
* type: array
* items:
* $ref: '#/definitions/User'
*/
app.get('/users', function(req, res) {
res.json([ {
id: 1,
username: 'jsmith',
}, {1
id: 2,
username: 'jdoe',
} ]);
});

/**
* @swagger
* /users:
* post:
* description: Returns users
* produces:
* - application/json
* parameters:
* - name: user
* description: User object
* in: body
* required: true
* type: string
* schema:
* $ref: '#/definitions/NewUser'
* responses:
* 200:
* description: users
* schema:
* $ref: '#/definitions/User'
*/
app.post('/users', function(req, res) {
// Generate ID
req.body.id = Math.floor(Math.random() * 100) * 1
res.json(req.body);
});

swagger-ui-express 공식 문서
swagger-jsdoc 공식 문서

정적 파일을 제공할 폴더 설정

1
app.use(express.static('public'));

express.static을 활용하여 public 폴더를 정적 파일을 제공하기 위한 기본 폴더로 지정한다.

정적 파일 요청 양식

1
2
3
4
5
localhost:3000/images/kitten.jpg
localhost:3000/css/style.css
localhost:3000/js/app.js
localhost:3000/images/bg.png
localhost:3000/hello.html

기본 폴더명인 public은 입력하지 않아도 된다.

참조

Formidable 설치하기

npm i -S formidable

html 에서 파일 입력받기

1
<input type="file" (change)="fileChange($event)" placeholder="Upload file" accept=".pdf,.doc,.docx">

입력받은 파일을 formData에 담아 서버로 전송하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fileChange(event) {
let fileList: FileList = event.target.files;
if(fileList.length > 0) {
let file: File = fileList[0];
let formData:FormData = new FormData();
formData.append('uploadFile', file, file.name);
let headers = new Headers();
/** No need to include Content-Type in Angular 4 */
headers.append('Content-Type', 'multipart/form-data');
headers.append('Accept', 'application/json');
let options = new RequestOptions({ headers: headers });
this.http.post(`${this.apiEndPoint}`, formData, options)
.map(res => res.json())
.catch(error => Observable.throw(error))
.subscribe(
data => console.log('success'),
error => console.log(error)
)
}
}

node server에서 수신하기

1
2
3
4
5
6
7
8
9
10
11
12
13
router.post('/cover_img',function(req,res){
console.log("커버이미지 저장 시작!");
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
console.log(files);
var oldpath = files.uploadFile.path;
var newpath = "/var/www/html/contents_cover_img/" + files.uploadFile.name;
fs.rename(oldpath, newpath, function (err) {
if (err) throw err;
res.sendStatus(200);
});
})
})

참고자료

세팅하기

  1. mongoose 설치
    npm install mongoose
  2. mongoose 임포트 해주기
    var mongoose = require('mongoose');
  3. 몽구를 이용하여 db 연결
    mongoose.connect('mongodb://username:password@host:port/database?options...');
    mongoose를 활용한 nodeje mongodb 연결

ObjectId 이용하기

1
mongoose.Types.ObjectId(req.params._id)

Model을 사용하여 update 하기

1
2
3
4
5
6
7
8
Apply.update({_id:saved_id},req.body,{upsert:true},function(err,docs){
if(err){
console.log(err);
res.sendStatus(500);
}else{
res.sendStatus(200);
}
})

$inc 를 활용하여 increase 하기

undefined

없으면 create하고 있으면 update하기

1
2
3
4
5
6
7
8
9
10
11
12
13
router.put('/',function(req,res){
console.log("스케줄 업데이트 처리 req.body:", req.body);
delete req.body._id;

Schedule.findOneAndUpdate({day:req.body.day, time:req.body.time},req.body,{upsert:true},function(err,docs){
if(err){
console.log(err);
res.sendStatus(500);
}else{
res.sendStatus(200);
}
})
})

upsert: true 항목을 추가한다.

$or를 활용하여 or 서치하기

1
2
3
4
5
6
7
8
9
10
ar userExists = function(u, callback) {
User.find({$or:[ {'username': u.username}, {'email': u.email}]} , function(err,user) {
if (err || user.length > 0) { // user does not come back null, so check length
callback(1);
return;
}
//no error, no user
callback(0);
});
};

NPM mongoose package Document

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×