TransWikia.com

não consigo adicionar uma linha à uma table usando o db.run() no sqlite3

Stack Overflow em Português Asked by julioHeyDev on December 9, 2020

Eu ja instalei o node static, para arrumar a primeira vez q o erro apareceu, que parecia estar relacionada à uma demora de resposta do server, mas msm depois de eu tirar essa demora, o erro continuou aparecendo, provavelmente relacionado à criação da table ou do arquivo database.db, mas n consigo achar, sou novo no sql, talvez por isso n esteja conseguindo achar o erro

o erro q estou recebendo é:

[Error: SQLITE_ERROR: near "PRIMARY": syntax error] {
  errno: 1,
  code: 'SQLITE_ERROR'
}
undefined:0



Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:518:11)
    at ServerResponse.header (C:UsersjulioOneDriveÁrea de TrabalhoMarketPlacenode_modulesexpresslibresponse.js:771:10)
    at ServerResponse.send (C:UsersjulioOneDriveÁrea de TrabalhoMarketPlacenode_modulesexpresslibresponse.js:170:12)
    at afterInsertData (C:UsersjulioOneDriveÁrea de TrabalhoMarketPlacesrcserver.js:99:24)
    at Statement.errBack (C:UsersjulioOneDriveÁrea de TrabalhoMarketPlacenode_modulessqlite3libsqlite3.js:14:21) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

a meu arquivo pra start é esse:

var express = require("express")
var server = express()

var http = require('http');

var nStatic = require('node-static');

var fileServer = new nStatic.Server('./public');

http.createServer(function (req, res) {
    
    fileServer.serve(req, res);

}).listen(5000);

// configurar pasta publica

//server.use(express.static("public"))

// habilitar uso do req.body
server.use(express.urlencoded({ extended: true }))


//pegar banco de
var db = require("./database/db")


//utilizando template engine
var nunjucks = require("nunjucks")
nunjucks.configure("src/views", {
    express: server,
})

server.get("/", (req, res) => {
    return res.render("index.html")
})

server.get("/createCliente", (req, res) => {
    return res.render("create-client-user.html")
})

server.get("/createStore", (req, res) => {
    return res.render("create-store-user.html")
})

 server.post("/saveuser", (req, res) => {

    // db.run(`
    // CREATE TABLE IF NOT EXISTS clientes (
    //     cell TEXT PRIMARY KEY,
    //     name TEXT,
    //     birthDate TEXT,
    //     rg TEXT,
    //     cep TEXT,
    //     uf TEXT,
    //     city TEXT,
    //     bairro TEXT,
    //     rua TEXT,
    //     numero TEXT,
    //     complement TEXT
    // );
    // `)

    const query = `
    INSERT INTO clientes (
        cell  PRIMARY KEY,
        name,
        birthDate,
        rg,
        cep,
        uf,
        city,
        bairro,
        rua,
        numero ,
        complement
    ) value(?,?,?,?,?,?,?,?,?,?,?);
    `

    const values = [    
        req.body.cell,
        req.body.name,
        req.body.day + "/" + req.body.month + "/" + req.body.year,
        req.body.rg,
        req.body.cep,
        req.body.uf,
        req.body.city,
        req.body.bairro,
        req.body.logradouro,
        req.body.num,
        req.body.complement
    ] 

    console.log(values)

    function afterInsertData(err) {
        if (err) {
            console.log(err)
            return res.send("Erro no cadastro!")
        }
    
        console.log("Cadastrado com sucesso")
        console.log(this)
    }
    
    db.run(query, values, afterInsertData)

    db.all(`SELECT name FROM clientes`, function(err, rows) {
        if(err) {
            return console.log(err)
        }

        console.log("Aqui estão seus registros: ")
        console.log(rows)
    })
    
    return res.render("index.html")
 })


server.listen(3000)

o meu arquivo db.js para startar o sqlite3 é:

``` //importar obj sqlite3
const sqlite3 = require("sqlite3").verbose()

//criar obj q vai fazer  operaç~oes no banco de daddo
const db = new sqlite3.Database("./src/database/database.db")

module.exports = db

db.serialize(() => {
//     db.run(`
//    CREATE TABLE IF NOT EXISTS clientes (
//        cell TEXT PRIMARY KEY,
//        name TEXT,
//       birthDate TEXT,
//        rg TEXT,
//        cep TEXT,
//        uf TEXT,
//        city TEXT,
//        bairro TEXT,
//        rua TEXT,
//        numero TEXT,
//        complement TEXT
//    );
//`)
}) 

meu arquivo html é esse, n adicionei também o script, pq ele apenas servia para popular alguns selects e dar autocomplete no CEP

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <link rel="stylesheet" href="http://localhost:5000/style/main.css">
</head>
<body>
    <div class="header">
        <img src="http://localhost:5000/imgs/logos/iconeLogo.png" alt="">
        <div class="links">
            <a href="/createCliente">Registrar-se</a>
            <a href="/createStore">Registrar minha Loja</a>
            <a href="">Em alta</a>
            <a href="">Registrar-se</a>
            <a href="">Registrar-se</a>
            <a href="">Registrar-se</a>
            <a href="">Registrar-se</a>
        </div>
    </div>
<h1>Criando Conta</h1>
<form action="/saveuser" method="POST">

    <fieldset>
        <div class="field">
            <label for="name">Nome:</label>
            <input type="text" name="name" required="required">
        </div>
        
        <div class="field">
            <label for="cell">Telefone Celular:</label>
            <input type="text" name="cell">
        </div>
        
        <div class="field-group">
            <label for="birthDate">Data de nascimento:</label>
            <select class="birthDate field" name="day" required="required">
                <option value="">Selecione o dia</option>
            </select>
            <select class="birthDate field" name="month" required="required">
                <option value="">Selecione o mês</option>
            </select>
            <select class="birthDate field" name="year" required="required">
                <option value="">Selecione o ano</option>
            </select>
        </div>
        
        <div class="field">
            <label for="RG">RG:</label>
            <input type="text" name="rg">
        </div>
        
        <div class="field-group adress">
            <div class="field">
                <label for="CEP">CEP:</label>
                <input class="CEP"  type="text" name="cep">
            </div>
            <div class="field">
                <label for="UF">Unidade Federal(Estado):</label>
                <input class="CEP UF"  type="text" name="uf">
            </div>
            <div class="field">
                <label for="city">Cidade:</label>
                <input class="CEP city"  type="text" name="city">
            </div>
            <div class="field">
                <label for="bairro">Bairro:</label>
                <input class="CEP bairro"  type="text" name="bairro">
            </div>
            <div class="field">
                <label for="logradouro">Logradouro:</label>
                <input class="CEP logradouro"  type="text" name="logradouro">
            </div>
            <div class="field">
                <label for="num">Número:</label>
                <input class="num"  type="text" name="num">
            </div>
            <div class="field">
                <label for="complement">Complemento:</label>
                <input class="complement"  type="text" name="complement">
            </div>
        </div>
    </fieldset>

    <button type="submit">Submit</button>
</form>
</body>
</html>

One Answer

Para resolver este erro:

[Error: SQLITE_ERROR: near "PRIMARY": syntax error] { errno: 1, code: 'SQLITE_ERROR' }

É necessário corrigir a sua query que faz a inserção dos dados, para isto remova o texto PRIMARY KEY da query, além disso é necessário corrigir a palavra valueque deveria ser values, o resultado final seria:

const query = `
    INSERT INTO clientes (
        cell,
        name,
        birthDate,
        rg,
        cep,
        uf,
        city,
        bairro,
        rua,
        numero ,
        complement
    ) values (?,?,?,?,?,?,?,?,?,?,?);
    `

Sua rota saveuser de inserção dos dados está fazendo mais do que deveria. Pois ela está inserindo os dados, e também está listando dados. Não tenho certeza da necessidade da função afterInsertData. Este talvez seja o motivo de estar recebendo a mensagem:

Cannot set headers after they are sent to the client

Correct answer by Danizavtz on December 9, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP