Node.js + Express + TypeScriptでWebAPIを作る（2/4）

## 概要

* メモ的な書き残し
* ログ周りを実装する
* APIの大枠（ルーティング）をちょっとだけ作る

##　参考

[[Node.js] Express を TypeScript で書く - ルーティング編](https://qiita.com/kuroneko8960/items/1e6dcd0d897b42567319)

ありがたく参考にさせて頂きました。

## ログクラスを作っておく

適当に扱いやすそうな形で作っておく。

```ts
// log.ts

import * as log4js from "log4js";

export class Log {

    public static init() {
        log4js.configure("./log4js.config.json");
    }

    public static accessFatal(message: string): void {
        const log = log4js.getLogger("access");
        log.fatal(message);
    }
    public static accessError(message: string): void {
        const log = log4js.getLogger("access");
        log.error(message);
    }
    public static accessWarning(message: string): void {
        const log = log4js.getLogger("access");
        log.warn(message);
    }
    public static accessInfo(message: string): void {
        const log = log4js.getLogger("access");
        log.info(message);
    }
    public static accessDebug(message: string): void {
        const log = log4js.getLogger("access");
        log.debug(message);
    }
    public static accessTrace(message: string): void {
        const log = log4js.getLogger("access");
        log.trace(message);
    }

    public static systemFatal(message: string): void {
        const log = log4js.getLogger("access");
        log.fatal(message);
    }
    public static systemError(message: string): void {
        const log = log4js.getLogger("access");
        log.error(message);
    }
    public static systemWarning(message: string): void {
        const log = log4js.getLogger("access");
        log.warn(message);
    }
    public static systemInfo(message: string): void {
        const log = log4js.getLogger("access");
        log.info(message);
    }
    public static systemDebug(message: string): void {
        const log = log4js.getLogger("access");
        log.debug(message);
    }
    public static systemTrace(message: string): void {
        const log = log4js.getLogger("system");
        log.trace(message);
    }
}
export default Log;
```

使う時はこんな感じ。

```ts
import Log from "./log";
Log.init();
Log.accessDebug("accessDebug");
Log.systemDebug("systemDebug");
```
使うところでinitして上手い具合に使う感じ。

## APIの形だけ作る

```
npm install --save-dev @types/express
```
```ts
// ./src/noImpl.ts
import * as Express from "express";
export default function noImpl(req: Express.Request, res: Express.Response, next: Express.NextFunction) {
    res.status(501).json({ message: "Not Implemented." });
}
```
```ts
// ./src/server.ts
import Express from "express";
import noImpl from "./noImpl";
const app = Express();
app.get("/", noImpl);
app.listen(3000, () => {
    console.log("listening on port 3000!");
});
export default app;
```
TSLintの方でconsole.logに対して警告を出すので一旦以下で回避。

```json
"rules": {
  "no-console": [
    false
  ]
}
```
ts-nodeでserver.tsを動かしてlocalhost:3000にアクセスすると501が返ってくるので大枠の確認は終わり。

本来はRESTを意識しつつCRUD整理して体系立てて作るんですが、まー仕事じゃないってことで適当にログインとユーザ情報だけ（中の実装は501）。

```ts
// ./src/routes/auth/index.ts
import * as Express from "express";
import noImpl from "../../noImpl";

const router = Express.Router();
router.post("/signin", noImpl);
router.delete("/signout", noImpl);
```
```ts
// ./src/routes/users/index.ts
import * as Express from "express";
import noImpl from "../../noImpl";
const router = Express.Router();

router.post("/signup", noImpl);
router.get("/:user", noImpl);
router.put("/:user", noImpl);
router.delete("/:user", noImpl);

export default router;
```

上記を追加したらserver.tsを以下のように修正

```ts
import express from "express";
import log from "./log";
import auth from "./routes/auth/index";
import users from "./routes/users/index";

log.init();

const app = express();
app.use("/auth", auth);
app.use("/users", users);

app.listen(3000, () => {
    log.systemTrace("listening on port 3000!");
});

export default app;
```

どこ叩いても404か501ですが、とりあえず最低限の形はできました。