$ sudo npm install @nestjs/cli -g
$ npx nest new nest_app
> npm
$ npm run start:dev
http://192.168.34.10:3000/
hello worldと表示されている
$ npm install ejs
nest-cli.json
{ "collection": "@nestjs/schematics", "sourceRoot": "src", "compilerOptions": { "assets": ["**/*.ejs"] } }
main.ts
import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { AppModule } from './app.module'; import { join } from 'path' async function bootstrap() { const app = await NestFactory.create<NestExpressApplication>(AppModule); app.useStaticAssets(join(__dirname, '..', 'public')) app.setBaseViewsDir(join(__dirname, '..', 'views')) app.setViewEngine('ejs') await app.listen(3000); } bootstrap();
views/index.ejs
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title><%= title %></title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> </head> <body> <h1 class="bg-primary text-white p-2"><%= header %></h1> <div class="container py-2"> <h2 class="mb-3"><%= title %></h2> <div class="alert alert-primary"> <%= message %> </div> </div> </body> </html>
src/app.controller.ts
import { Controller, Get, Render } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() @Render('index') root(){ return { title: 'Nest sample app', header: 'Nest.js', message: 'Hello world!' } } }
index.ejs
<body> <h1 class="bg-primary text-white p-2"><%= title %></h1> <div class="container py-2"> <h2 class="mb-3"><%= msg %></h2> <div class="alert alert-primary"> <form method="post" action="/"> <div class="mb-2"> <label>ID:</label> <input type="text" name="id" class="form-control"> </div> <div class="mb-2"> <label>password:</label> <input type="password" name="pass" class="form-control"> </div> <div> <input type="submit" value="送信" class="btn btn-info"> </div> </form> </div> </div> </body>
src/app.controller.ts
import { Controller, Get, Post, Body, Render } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get('/') @Render('index') root(){ return { title: 'Nest app', msg: 'send form:' } } @Post('/') @Render('index') send(@Body() form:any){ return { title: 'Nest form', msg: JSON.stringify(form) } } }
### Ajax
app.controller.ts
@Post('/') send(@Body() form:any){ return form }
index.ejs
<script src="index.js"></script> </head> <body> <h1 class="bg-primary text-white p-2"><%= title %></h1> <div class="container py-2"> <h2 class="mb-3"><%= msg %></h2> <div class="alert alert-primary"> <div class="mb-2"> <label>ID:</label> <input type="text" name="id" class="form-control"> </div> <div class="mb-2"> <label>password:</label> <input type="password" name="pass" class="form-control"> </div> <div> <input type="submit" value="送信" class="btn btn-info"> </div> </div> </div> </body>
public/index.ts
import { Controller, Get, Post, Body, Render } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get('/') @Render('index') root(){ return { title: 'Nest app', msg: 'send form:' } } @Post('/') send(@Body() form:any){ return form } }
なんか上手く動いていないような気がするが…