TypeScript でつくるシングルページアプリケー 4.2.5 Dao クラス シ ' ョン 次は Da 。クラスを作成します。今回使用するテープルは一つだけなので、 1 ファイルで済ま せてしまいます。基底クラスやインタフェースも作成しません。 . /m0dels/RegisteredArticle { RegisteredArticle } from { Art i 引 e } from . /m0dels/ArticIe' import * as mysql from 'mysql' リスト 4. 2.5 server/dao/ArticleDao. ts import import import . /models/AppError ・ { AppError } from * 記事データ用 Dao クラス export class ArticleDao { * データベースコネクション pr ivate connection: mysql. lConnection, * コンストラクタ * @param {mysql. lConnection) connection データベースコネクション constructor (connect i on : mysq l. lConnect i (n) { connection; this. connection const query insert intO article (title, bOdY, created—at, insertArticle(articIe: Article) : Promise く number> { updated at) values ( ? , ? , now() , now())' const param = [ a rt i 引 e. t i t 尾 , article. b0dY return new Promise く number>((resolve, reject) this. connection. query(query, param, (error, if (error) { reject(error) : return, resolve(result. insertld) ; 27 result) = > {
TypeScript でつくるシングルページアプリケーション const connect i on = mysq に createConnect i on (DbConf i gManager. getConf i g ( ) ) ; connect i on. connect ( ) : const articleDao new Art i c leDao (connect i (n) ; try { return await articleDao. selectArticles(offset, } catch(error) { throw error, } f i na Ⅱ y { connection. destroy() ; * 登録されている記事の件数を取得します。 * @returns {Promise く number>) async findArticIeCount() : Promise く number> { ⅱ m i t) : const connect i on = mysq に createConnect i on (DbConf i gManager. getConf i g ( ) ) : connect i on. connect ( ) : const articleDao = new ArticleDao(connection) ; try { return await articIeDao. selectCount() ; } catch(error) { throw error, } f i na Ⅱ y { connection. destroy() ; * 記事を新規登録します。登録完了時、登録した記事の id を返します。 * @param article * @returns {Promise く number>) async createArticIe(article: Article) : Promise く number> { const connect i on = mysq l. createConnect i on (DbConf i gManager. getConf i g ( ) ) : connect i on. connect ( ) : const articIeDao = new ArticleDao(connection) : try { return await articleDao. insertArticle(article) : } catch(error) { throw error, } f i na Ⅱ y { connect i on. destroy ( ) : 32
TypeScript でつくるシングルページアプリケーション article. body, this. connection. query(query, if (error) { reject(error) ; return, resolve(results) ; params, (error, results) deleteArticle(id: number) : Promise く any> { return new Promise く void>((resolve, reject) ニ > DELETE FROM art i 引 e WHERE ID const query result) = > { (error, this. connection. query(query, [id], if (error) reject(error) : return, resolve(result) ; lock(id: number) : Promise く RegisteredArticle> { return new Promise<RegisteredArticle>((resolve, reject) select + const query t i t 尾 ' + b0dy' + DATE FORMAT (created_at, DATE_FORMAT (updated_at, from article where id = ? for this. connection. query(query, if (error) { reject(error) ; return, resolve(results) : \ ' %Y-%m-%d %k : % i : %sY' ) as updatedAt' \ ' %Y-%m-%d %k : % i : %sY' ) as createdAt' update results) = 〉 { (error, 30 十 十
TypeScript でつくるシングルページアプリケーション const connect i on ニ mysq l. createConnect i on (DbConf i gManager. getConf i g ( ) ) ; Promise<RegisteredArticIe> { async m0difyArticIe(id: number, article: RegisteredArticle): connection. destroy() ; } f i na Ⅱ y { throw error, } catch(error) { return await articleDao. selectArticleBYld(id) ; try { const articleDao new ArticIeDao(connection) ; connect i on. connect ( ) : const connect i on ニ mysq l. createConnect i on (DbConf i gManager. getConf i g ( ) ) ; async findArticle(id: number) : Promise く RegisteredArticle[]> { * @returns {Promise く RegisteredArticle>} * @param id * 引数で指定された id の記事を取得します。 try { const articIeDao = new ArticleDao(connection) ; connect i on. connect ( ) ; if (!Array. isArray(results) Ⅱ results.length = const results = awa i t art i c 尾 Dao コ ock ( i d) ; if (results[O] . updatedAt ! = article. updatedAt) = 404 , = new AppError ( ) : const error error. status throw error, const error error. status throw error, = new AppError ( ) : = 500 , return await articleDao. updateArticle(id, catch(error) throw error; f i na Ⅱ y { connection. destroy() ; a rt i c 尾 ) : async removeArticle(id: number) : Promise く void> { const connect i on = mysq l. createConnect i on (DbConf i gManager. getConf i g ( ) ) ; 33 const articleDao new Art i 引 eDao (connect i (n) ; connect i on. connect ( ) ;
TypeScript でつくるシングルページアプリケーション order by id' + ⅱ m i t ? , グ this. connection. query(query, [offset, limit], if (error) { reject(error) ; return, (error, results) = > { resolve(results) ; seIectArticIeById(id: number) : Promise<RegisteredArticle[]> { return new Promise<RegisteredArticle[]>((resoIve, reject) = 〉 { select ' + const query t i t 尾 ' + body' + DATE_FORMAT (created_at, \ ' %Y-%m-%d %k : % i : %sY' ) as createdAt' + DATE_FORMAT (updated at, \ ' %Y-%m-%d %k : % i : %sY' ) as updatedAt' + from article' 十 where id this. connection. query(query, [id], if (error) { reject(error) ; return, results) = > { (error, if (!Array. isArray(results) Ⅱ results.length = const appError = new AppError ( ' Article data is not found. ' ) ; appError. status = 404 , reject(appError) ; return, resolve(results) ; updateArticle(id: number, article: Article) : Promise く any> { return new Promise く any>((resolve, reject) = > { update article + const query set t i t 尾 = b0dy = wh e r e i d const params a rt i c 尾 . t i t 尾 , updated_at = now ( ) 十 29
TypeScript でつくるシングルページアプリケーション return new Promise<Article ロ >((resolve, reject) = > { seIectAIlArticIes() : Promise く RegisteredArticle ロ〉 { select' + const query t i t 尾 ' + body' + DATE_FORMAT (created_at, DATE_FORMAT (updated at, from a rt i C ー e 十 order by id this. connection. query(query, if (error) { reject(error) : return, resolve(results) ; sel ectCount ( ) : Prom i se く number> { \ ' %Y-%m-%d %k : % i : %sY' ) as createdAt' \ ' %Y-%m-%d %k : % i :%sY' ) as updatedAt' ロ , (error, results) = 〉 { 十 十 return new Promise く number>((resolve, reject) = > { select count(id) as count from article const query this. connection. query(query, ロ , if (error) { reject(error) ; return, if (typeof results[O] . count ! = ー throw new TypeError ( ) ; res01ve(resuIts[0] . count) ; (error, results) = > { number' ) { selectArticles (offset: number = 0 , limit: Promise く RegisteredArticIe[]> { return new Promise く Article ロ >((resolve, reject) number select' + const query t i t 尾 ' + body' + DATE FORMAT (created_at, DATE_FORMAT (updated_at, from article' 十 \ ' %Y-%m-%d %k:%i :%sY' ) as createdAt' \ ' %Y-%m-%d %k : % i : %sY' ) as updatedAt' 28 十 十
TypeScript でつくるシングノレベージアプリケーション try { connection. destroy() ; } f i na Ⅱ y { throw error, } catch(error) { return await articIeDao. deleteArticle(id) ; throw error, error. status ニ 404 , const error = new AppError ( ) ; if (!Array. isArray(resuIts) Ⅱ results.length = = awa i t art i 引 eDao.I ock ( i d) ; const results 最後にコントローラクラスを作成します。 4.2.7 コントローラクラス import import import lmport import リスト 4.2. 7 server/controllers/ArticleController. ts as express from express { ArticIeService } from . /services/ArticleService { AppError } from .. /model s/AppError" , { Art i 引 e } from . /m0dels/ArticIe" { RegisteredArticIe } from . /models/RegisteredArticle" * 記事 A 円用コントローラ export class ArticleController { all (req: express. Request, res: express. Response, vo i d { private articleService: ArticleService; * コンストラクタ constructor ( ) { this. articleService = new ArticleService() ; 34 next . express. NextFunction) :
TypeScript でつくるシングルページアプリケー 4.2.6 サーヒスクラス ・シ・・ヨン・ 次にサービスクラスを作成します。これも Dao クラス同様 1 クラスのみ作成します。 { AppError } from . /model s/AppError ' , { Art i c 尾 } from . /model s/Art i c 尾 " . /m0dels/RegisteredArticle' { RegisteredArticIe } from . /dao/ArticleDao' { ArticleDao } from . /conf i g/DbConf i gManager' { DbConf i gManager } from import * as mysql from mysql' リスト 4.2.6 server/dao/ArticleService. ts import import import import import return await articIeDao. selectAllArticles() ; try { const articleDao new Art i c leDao (connect i (n) ; connect i on. connect ( ) , const connect i on = mysq に createConnect i on (DbConf i gManager. getConf i g ( ) ) ; async findAllArticIes() : Promise く RegisteredArticle[]> { * @returns {Promise く RegisteredArticle[]>) * 登録済みの全ての記事データを取得します。 export class ArticleService { * @class ArticIeService * @export * 記事データに関するロジック connection. destroy() ; } f i na Ⅱ y { throw error, } catch(error) { * @returns {Promise<RegisteredArticle[]>) * @param {number} * @param {number} offset * 第一引数と第二引数で指定された登録済記事データを取得します。 31 limit: number) : Promise く RegisteredArticle ロ > { async findArticles (offset: number,