수정 API를 만드는데, 2개 이상을 수정할 수 있게 만들고 있다.
가령, 유저 정보 수정일 때 이름 / 성별 / ... 등을 수정하고 싶다고 하자.
클라이언트에서는 이름만 수정해도 되고, 이름 / 성별 둘 다 수정해도 되고 .. 어쨌든 한 가지 이상 수정하도록 만들 예정
이전에 벡앤드 단 코드를 짤 때는 Query Builder 없이 클라이언트에서 넘겨주는 정보(이름, 성별 등)를 바탕으로 직접 내가 Query를 짰는데, Query Builder라는 라이브러리가 이미 있었다 ㅋㅋ
Node.js에서는 Knex를 많이 사용하는 듯 했다.
공식 사이트에서 update 문서를 찾아보니 역시 내가 원하던게 이미 있었다.
knex('books')
.where('published_date', '<', 2000)
.update({
status: 'archived',
thisKeyIsSkipped: undefined
})
// Outputs:
update `books` set `status` = 'archived' where `published_date` < 2000
update 구문에 thisKeyIsSkipped 는 undefined로 되어 있는데 Outputs를 보니 thisKeyIsSkipped 를 제외한 Query가 만들어졌다. 이걸 사용하면 내가 javascript로 번거롭게 이름 / 성별 어떤게 값이 있고 없는지 판단할 필요가 없어졌다.
knex모듈을 하나 만들고,
참고로 Client에 그냥 mysql이라고 쓰면
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
위과 같은 오류가 난다. 해결 방법 -> mysql2 사용하기 ㅋㅋ
// knex.js
const knex = require('knex')({
client: 'mysql2',
connection: {
host: '',
user: '',
password:'',
database: ''
}
})
module.exports = {
knex: knex
};
다음과 같이 Knex를 사용하면
// XXXController.js
const {knex} = require('./knex');
...
knex('Playlist')
.where({
user_idx: userIdx,
idx: playlistIdx
})
.update({
title: title,
color: color
})
.then(function() {
// console.log('성공');
return res.json({isSuccess: true, code: 200, message: "Playlist 수정 성공"});
})
.catch(function(error) {
// console.error(error)
return res.json({isSuccess: false, code: 500, message: "Playlist 수정 실패"});
});
클라이언트에서 넘어오는 값에 상관없이 Query를 만들어서 실행 성공했다.
09.24 트랜젝션
아래의 예제를 변형하자
// Using trx as a transaction object:
knex.transaction(function(trx) {
const books = [
{title: 'Canterbury Tales'},
{title: 'Moby Dick'},
{title: 'Hamlet'}
];
knex.insert({name: 'Old Books'}, 'id')
.into('catalogues')
.transacting(trx)
.then(function(ids) {
books.forEach((book) => book.catalogue_id = ids[0]);
return knex('books').insert(books).transacting(trx);
})
.then(trx.commit)
.catch(trx.rollback);
})
.then(function(inserts) {
console.log(inserts.length + ' new books saved.');
})
.catch(function(error) {
// If we get here, that means that neither the 'Old Books' catalogues insert,
// nor any of the books inserts will have taken place.
console.error(error);
});
await, async 관련은 comming soon