AWS NodeJS App 03 – Pesquisa por produtos
Neste tutorial vamos implementar a funcionalidade de busca de produtos pela caixa de texto que esta no topo da página. Para isso vamos utilizar o método Scan do DynamoDB para recuperar os produtos cujo nome sejam semelhante com a busca que estamos realizando. Para isso vamos precisar de mais uma biblioteca chamada @aws/dynamodb-expressions para realizar a comparação dos valores. Execute o comando a seguir no terminal do Cloud9 para instalar a dependência no projeto.
npm install --s @aws/dynamodb-expressions
Em seguida vamos modificar o código do arquivo index2.hbs para que o campo de consulta direcione a requisição para o controlador de rotas do backend utilizando o método POST. Modificamos o tag FORM para incluir o action e o method POST. Colocamos em comentário todo o tag SELECT para simplificar a busca, e alteramos o tag INPUT para incluir o parâmetro name=”search”

<div class="col-lg-6 col-sm-8"> <form action="/" method="POST" class="search-wrap"> <div class="input-group w-100"> <input type="text" name="search" class="form-control" style="width:55%;" placeholder="Search"> <!--<select class="custom-select" name="category_name"> <option value="">All type</option><option value="codex">Special</option> <option value="comments">Only best</option> <option value="content">Latest</option> </select>--> <div class="input-group-append"> <button class="btn btn-primary" type="submit"> <i class="fa fa-search"></i> </button> </div> </div> </form> <!-- search-wrap .end// --> </div> <!-- col.// -->
Então vamos modificar nossa classe ProductService para criar um novo método chamado getAllBySearch. Observe que a biblioteca expressions foi utilizada para carregar a function contains. Em seguida o novo método de busca foi implementado, esse método recebe o parâmetro de busca e chama a função scan passando a class Product e um objeto anônimo contendo o filtro de busca. Uma vez retornado o resultado ele é carregado de forma assíncrona para um vetor list e retornado.

var { DataMapper, DynamoDbSchema, DynamoDbTable } = require('@aws/dynamodb-data-mapper'); var ConditionExpression = require('@aws/dynamodb-expressions'); var {contains} = require('@aws/dynamodb-expressions'); 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 getAllBySearch(search){ var list = []; var result = await mapper.scan(Product,{limit:5, filter: { ...contains(search), subject: 'name' }}); for await (const item of result) { list.push(item); } return list; } async getAll(){ var list = []; var result = await mapper.scan(Product,{limit:5}); for await (const item of result) { list.push(item); } return list; } } module.exports = ProductService;
Agora podemos alterar nossa classe IndexController, para criar o método search que será a ação executada toda vez que a rota “/” receber uma requisição utilizando o método POST. Esse método verifica se no body da requisição foi passado o parâmetro search, caso não tenha sido passado ele executa o método de busca do serviço para retornar todos os itens, e caso contrário, executa o método getAllBySearch.

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 }); } async search(req,res,next){ var search = req.body.search; var listProduct = null; if(search ===""){ listProduct = await productService.getAll(); }else{ listProduct = await productService.getAllBySearch(search); } res.render('index2', { listProduct: listProduct }); } } module.exports = IndexController;
Por fim vamos alterar o arquivo index.js para incluir a nova rota que será delegada para o método search do IndexController.

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); }); router.post('/', function(req, res, next) { indexController.search(req,res,next); }); module.exports = router;
Execute novamente a aplicação utilizando o comando nodemon, e verifique se o campo de busca retorna a lista de produtos de acordo com os valores.