AWS NodeJS App 02 – Consulta DynamoDB
Antes de iniciar o desenvolvimento da nossa aplicação vamos instalar o pacote nodemon, que facilita o processo de desenvolvimento pois ele além de colocar nossa aplicação em execução ele monitora qualquer alteração no código fonte da aplicação e reinicia o servidor para que as modificações sejam refletidas. Mais detalhes em: https://www.npmjs.com/package/nodemon
Utilize o comando:
npm install -g nodemon

Para simplificar o processo de desenvolvimento, vamos utilizar a biblioteca DynamoDB Data Mapper para mapear nossos objetos de dados com os objetos recuperados e enviados para o DynamoDB.
npm install --save @aws/dynamodb-data-mapper @aws/dynamodb-data-mapper-annotations @aws-sdk/client-dynamodb-v2-node
O próximo passo foi criar uma pasta chamada models dentro de nossa aplicação e dentro dela inserir a classe Product que servirá como classe modelo para troca de dados dentro do modelo MVC.
var { DataMapper, DynamoDbSchema, DynamoDbTable } = require('@aws/dynamodb-data-mapper'); class Product{ } Object.defineProperties(Product.prototype, { [DynamoDbTable]: { value: 'product' }, [DynamoDbSchema]: { value: { id: { type: 'String', keyType: 'HASH' }, description: {type: 'String'}, name: {type: 'String'}, price: {type: 'Number'} }, }, }); module.exports = Product;

Agora crie uma nova pasta na aplicação chamada services, dentro desta pasta crie um programa chamado productservice.js, nesta classe vamos utilizar o SDK da AWS para connectar ao DynamoDB e realizar uma simples consulta do tipo scan e retornar os objetos encontrados.
var { DataMapper, DynamoDbSchema, DynamoDbTable } = require('@aws/dynamodb-data-mapper'); var DynamoDB = require('aws-sdk/clients/dynamodb'); const client = new DynamoDB({region: 'us-east-2'}); const mapper = new DataMapper({client}); const Product = require("../models/product"); class ProductService{ async getAll(){ var list = []; var result = await mapper.scan(Product); for await (const item of result) { list.push(item); } return list; } } module.exports = ProductService;

Agora vamos construir a lógica do controlador da interface view index. Para isso crie uma pasta no projeto com o nome controller e dentro dela crie um novo arquivo chamado indexcontroller.js Utilize o código de exemplo abaixo.
var ProductService = require("../services/productservice"); var productService = new ProductService(); class IndexController{ async index(req,res,next){ var listProduct = await productService.getAll(); //console.log(JSON.stringify(listProduct, null, 4)); res.render('index2', { listProduct: listProduct }); } } module.exports = IndexController;

Por fim devemos alterar o arquivo de rotas para que quando a página index for acessada, este controlador seja chamado contendo a lógica da apresentação dos produtos. Para isso dentro da pasta routes altere o código do arquivo index.js
var express = require('express'); var router = express.Router(); var IndexController = require("../controller/indexcontroller"); var indexController = new IndexController(); /* GET home page. */ router.get('/', function(req, res, next) { indexController.index(req,res,next); }); module.exports = router;

Então podemos modificar o código da VIEW para apresentar os dados dos produtos. Dentro da pasta views procure pelo arquivo index2.hbs, dentro deste arquivo você vai encontrar duas vezes o tag: <article class=”card card-product”> deixe apenas o primeiro grupo de tags article com esta class card-product, e remova todo o segundo conjunto. Antes de iniciar o tag article utilize o comando {{#each listProduct}} da biblioteca Handlebars para indicar o início do bloco de repetição. No tag H4 utilize o comando {{this.name}} para que o nome do produto seja apresentado.

Agora no fim do conjunto de tags </article> utilize o comando {{/each}} do Handlebars para indicar o fim do bloco.

Execute a aplicação través do comando nodemon e acesse o endereço de preview, para se certificar que os dados são apresentados com sucesso.
