駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

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');
mongoose.connect('mongodb://localhost:27017/farmStand',
{ useNewUrlParser: true, useUnifiedTopology: true })
.then*1;
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'