ExpressでMongooseを使う part6
農産物の商品管理アプリ作成の続きで、最後になります。
商品の詳細ページから商品の削除ができるようにします。
フォームのリクエストは「GET」か「POST」しか投げることができません。
DELETEリクエストも「PUT」と同様になるので今回も「method-override」を使用し
ます。
ルーティングの追加をしていきます。
・index.js
const express = require('express');
const app = express();
const path = require('path');
const mongoose = require('mongoose');
//method-overrideの宣言
const methodOverride = require('method-override');
const Product = require('./models/product');
{ useNewUrlParser: true, useUnifiedTopology: true })
app.set('view engine', 'ejs');
app.use(express.urlencoded({ extended: true }));
//リクエストはpostかgetのみなのでPUT, DELETEを使えるようにオーバーライドしておく
app.use(methodOverride('_method'))
//カテゴリを配列にしておき、ejsの方でループさせることで管理
const categories = ['果物', '野菜', '乳製品'];
//商品一覧
//カテゴリで絞り込み
app.get('/products', async (req, res) => {
const products = await Product.find({})
res.render('products/index', { products});
})
//商品登録フォーム
app.get('/products/new', (req, res) => {
res.render('products/new', { categories });
})
app.post('/products', async (req, res) => {
const newProduct = new Product(req.body);
await newProduct.save();
res.redirect(`/products/${newProduct._id}`);
})
//商品詳細ページ
app.get('/products/:id', async (req, res) => {
//id取得
const { id } = req.params;
const product = await Product.findById(id).populate('farm', 'name');
res.render('products/show', { product });
})
//商品の更新
app.get('/products/:id/edit', async (req, res) => {
const { id } = req.params;
const product = await Product.findById(id);
res.render('products/edit', { product, categories });
})
//編集のリクエストエンドポイント
app.put('/products/:id', async (req, res) => {
const { id } = req.params;
const product = await Product.findByIdAndUpdate(id, req.body,
{ runValidators: true, new: true });
res.redirect(`/products/${product._id}`);
})
//削除機能
app.delete('/products/:id', async (req, res) => {
const { id } = req.params;
const deletedProduct = await Product.findByIdAndDelete(id);
res.redirect('/products');
})
//ポート作成
app.listen(3000, () => {
console.log('ポート3000で待機');
})
「findByIdAndDelete」を使用して対象となるIDを取得し、削除する流れになります。
画面で確認してみます。
レタスを削除するようにします。
下記の通りレタスが削除されています。
*1:) => {
console.log('MongoDBコネクションOK!!');
})
.catch(err => {
console.log('MongoDBコネクションエラー!!!');
console.log(err);
});
app.set('views', path.join(__dirname, 'views'