Crie sua própria API CRUD no Express e MySQL: parte um

Olá a todos. Antecipando o início do curso "Fullstack JavaScript Developer" , queremos compartilhar um pouco de material que foi escrito por nosso escritor freelancer.



O Express é uma das estruturas da Web mais populares que suporta roteamento, pesos médios e um sistema de modelos. Fazer um back-end no Node.js sem o Express em 2020 é uma atividade bastante estranha, porque o Express é uma estrutura de fato para criar um aplicativo da Web no Node.js.
Hoje tentaremos criar uma API CRUD simples usando o banco de dados MySQL. Um leitor experiente do Node.js. perguntará: onde está o MongoDB, com o qual o Node.js. geralmente são usados ​​juntos? nós vamos usar o MySQL. Criaremos uma API para um aplicativo Todo simples, caso alguém queira se conectar ao seu todo (e não importa se está escrito com React ou não), anexaremos um pouco para trás e brincaremos com ele.


"Arquitetura" e a essência da nossa aplicação



Em nosso aplicativo, será possível criar, receber, atualizar e excluir Todo. Em geral, teremos um conjunto mínimo de funções CRUD (criar exclusão de atualização de leitura).

No final, combinaremos o aplicativo com o aplicativo React e testaremos tudo.

Primeiro, darei a estrutura dos arquivos do aplicativo: a



seguir, darei uma tabela de ações e métodos que estão em nosso aplicativo:

MétodosURLAções
Pegue/ ofertasrecebendo todos os casos
Pegue/ ofertas / 2Obtendo a identificação com o número 2
Postar/ ofertasadicionando um novo caso
Colocar/ ofertas / 3Atualizar usuário com id = 3
EXCLUIR/ ofertas / 3excluir usuário com id = 3
EXCLUIR/ ofertasremover todos os usuários

Criando seu aplicativo Node.js.

Vá para o seu diretório favorito, inicie o terminal e crie seu aplicativo. A propósito, provavelmente está claro no título que o Node.js já deve estar instalado. Se você ainda não o fez, simplesmente não pode ser baixado do link aqui.

    $ mkdir CRUD_API
    $ cd CRUD_API

Em seguida, você precisa inicializar nosso aplicativo usando o npm init . Porque Como nosso aplicativo é mais um teste e treinamento, usarei um comando que preencherá todos os dados padrão para não perder tempo com pequenos detalhes:

 npm init -y
 

Nesse caso, com as mãos em mãos, package.jsonvocê poderá alterar os dados para os que você precisa: o repositório do github, tags, autor, etc.

Então, precisamos colocar todos os pacotes necessários para o aplicativo funcionar:

  npm i express mysql body-parser --save


Se você enviar seu desenvolvimento para o github mais tarde, crie um arquivo oculto .gitignorepara não arrastar os node_modules mais pesados e se desonrar . Nós escrevemos:

    touch .gitignore 
    code .gitignore 

Entramos lá node_modules, mais adiante neste arquivo, você pode inserir os nomes de pastas e arquivos que deseja ver posteriormente no servidor remoto.

Configuração básica do Express


Na pasta raiz do projeto, crie um arquivo server.js:

    const express = require("express");
    const bodyParser = require("body-parser");
    
    const app = express();
    
    //     json
    app.use(bodyParser.json());
    
    //    : application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: true }));
    
    //   response - request
    app.get("/", (req, res) => {
      res.json({ message: "    " });
    });
    
    //  ,   
    app.listen(3001, () => {
      console.log("   3001 ");
    });

Agora podemos iniciar o servidor com:

node server.js

Precisamos do Express para criar nossa API, e o pacote body-parser nos ajuda a analisar a solicitação e a criar req.bodyuma que seja útil para roteamento.

Agora nosso servidor pode fazer o seguinte:

  • Crie um aplicativo Express que torne o analisador de corpo uma alavanca intermediária usando app.use ()
  • temos um get simples, apenas para testar o aplicativo
  • Ouça a porta 3001 para todas as alterações recebidas

Inicialmente, nosso aplicativo funciona, então você pode fazer o banco de dados.

Crie sua tabela de dados MySQL

Eu realmente espero que o leitor deste artigo não tenha problemas ao baixar e instalar o MySQL e o MySQLWorkBranch por conta própria. Em seguida, você mesmo cria um esquema (DB) com o nome que mais gosta (no meu caso, TODO) e, em seguida, seleciona a solicitação de raio e copia / digite o seguinte comando:

    CREATE TABLE IF NOT EXISTS `todo` (
        id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        text varchar(255) NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Em nosso banco de dados, tudo será no mínimo: apenas id e o texto do caso em si. No entanto, para adicionar outra coluna na qual, por exemplo, a urgência do seu caso possa ser descrita, espero que isso não cause problemas.

Configuração e conexão com nosso banco de dados

Vamos estabelecer e configurar a conexão com o banco de dados. Criaremos uma nova pasta de aplicativo diretamente em nossa pasta raiz e, em seguida , criaremos um arquivo db.config.jsna pasta config, com aproximadamente o mesmo conteúdo, que depende das suas configurações no MySQLWorkBranch. No meu caso, o arquivo ficará assim:

  module.exports = {
    HOST: "localhost",
    USER: "pavel",
    PASSWORD: "",
    DB: "TODO"
  };

Depois disso, crie uma pasta para descrever nossos modelos de aplicativos / modos , nos quais criaremos um modelo:

  const mysql = require("mysql");
  const dbConfig = require("../config/db.config.js");
  
  //      
  const connection = mysql.createConnection({
    host: dbConfig.HOST,
    user: dbConfig.USER,
    password: dbConfig.PASSWORD,
    database: dbConfig.DB
  });
  
  //      
  connection.connect(err => {
    if (err) throw error;
    console.log("    ");
  });

  module.exports = connection;
   //  

Criar modelo

Na pasta model, criamos um arquivo chamado deal.model.js. Se você tiver uma pergunta, o que é um modelo em geral, leia um artigo como este e se familiarize com o padrão de design do MVC. Vou criar um construtor para um objeto Deal e usar a conexão para as seguintes funções CRUD:

  • criação de um novo negócio
  • localizando caso por id
  • recebendo todos os casos
  • capacidade de atualizar nosso caso por id
  • Excluir um caso por ID
  • exclusão completa de todos os casos

Total, temos que fazer o seguinte:

  //   
  const Deal = function(deal) {
    this.text = deal.text;
  };
  //    ,        CRUD,      :
  Deal.create = (newDeal, result) => {
    sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
      //   SQL
      if (err) {
        console.log("error: ", err);
        result(err, null);
        //   ,     
        return;
      }
  
      console.log(" ", { id: res.insertId, ...newDeal });
      result(null, { id: res.insertId, ...newDeal });
    });
  };


Colocarei o restante do código no spoiler, porque não vejo nenhum motivo para trazer tudo, porque, na verdade, o padrão de código é repetido lá, apenas os comandos e argumentos sql mudam:

o resto do código
Deal.findById = (dealId, result) => {
sql.query(`SELECT * FROM TODO WHERE id = ${dealId}`, (err, res) => {
if (err) {
console.log(«error: », err);
result(err, null);
return;
}

if (res.length) {
console.log(« : », res[0]);
result(null, res[0]);
return;
}

//
result({ kind: «not_found» }, null);
});
};

Deal.getAll = result => {
sql.query(«SELECT * FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(«deals: », res);
result(null, res);
});
};

Deal.updateById = (id, deal, result) => {
sql.query(
«UPDATE TODO SET text =? WHERE id = ?»,
[deal.text, id],
(err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
result({ kind: «not_found» }, null);
return;
}

console.log(« », { id: id, ...deal });
result(null, { id: id, ...deal });
}
);
};

Deal.remove = (id, result) => {
sql.query(«DELETE FROM TODO WHERE id = ?», id, (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
// id
result({ kind: «not_found» }, null);
return;
}
console.log(« », id);
result(null, res);
});
};

Deal.removeAll = result => {
sql.query(«DELETE FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(`deleted ${res.affectedRows} deals`);
result(null, res);
});
};



É tudo por agora. A próxima parte deste artigo está se aproximando, na qual terminamos de escrever o verso e começamos a testá-lo. E, por tradição, alguns links úteis:


All Articles