12
respostas

Erro ao iniciar o node server

Criei uma aplicação baseada no que aprendi no curso de angular, mas ao digitar npm start, é retornado o erro abaixo. npm start

parametrizacao@1.0.0 start C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server node server.js

Banco data.db pronto para uso C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\client Servidor escutando na porta: 3000 _http_outgoing.js:356 throw new Error('Can\'t set headers after they are sent.'); ^

Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\express\lib\response.js:718:10) at ServerResponse.json (C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\express\lib\response.js:246:10) at C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\app\api\index.js:41:13 at newArguments.(anonymous function) (C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\nedb\lib\executor.js:29 :17) at Cursor.execFn (C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\nedb\lib\datastore.js:484:12) at callback (C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\nedb\lib\cursor.js:126:19) at C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\nedb\lib\cursor.js:193:12 at C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\nedb\lib\datastore.js:329:14 at Object.async.eachSeries (C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\node_modules\nedb\node_modules\async\lib\async .js:130:20)

npm ERR! Windows_NT 10.0.10586 npm ERR! argv "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" "start" npm ERR! node v6.11.4 npm ERR! npm v3.10.10 npm ERR! code ELIFECYCLE npm ERR! parametrizacao@1.0.0 start: node server.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the parametrizacao@1.0.0 start script 'node server.js'. npm ERR! Make sure you have the latest version of node.js and npm installed. npm ERR! If you do, this is most likely a problem with the parametrizacao package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! node server.js npm ERR! You can get information on how to open an issue for this project with: npm ERR! npm bugs parametrizacao npm ERR! Or if that isn't available, you can get their info via: npm ERR! npm owner ls parametrizacao npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request: npm ERR! C:\Users\t711410\Desktop\RafaelBonilha\Angular\parametrizacao\server\npm-debug.log

Agradeço desde já pela ajuda neste caso, já pesquisei na internet e não achei nenhuma solução para este problema.

12 respostas

Oi João, me parece que você está tentando modificar um cabeçalho HTTP depois que a resposta já foi enviada para o cliente. Não dá pra afirmar com 100% de certeza apenas com essa mensagem de erro.

Cola aqui pra gente ver o package.json e a configuração do express por favor?

Você tentou recriar novamente o server?

Bom Dia Amigos,

segue o package.json e a config do express. Recriei o server tbm.

package.json.:

{
  "name": "client",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lite": "lite-server",
    "tsc:w": "tsc -w",
    "ng": "ng",
    "lint": "ng lint",
    "start": "npm run tsc:w",
    "typings": "typings"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@angular/common": "^4.2.4",
    "@angular/compiler": "^4.2.4",
    "@angular/core": "^4.2.4",
    "@angular/forms": "^4.2.4",
    "@angular/http": "^4.2.4",
    "@angular/platform-browser": "^4.2.4",
    "@angular/platform-browser-dynamic": "^4.2.4",
    "@angular/router": "^4.2.4",
    "@angular/upgrade": "^4.2.4",
    "core-js": "^2.4.1",
    "reflect-metadata": "^0.1.3",
    "rxjs": "^5.4.2",
    "systemjs": "^0.19.27",
    "zone.js": "^0.8.14",
    "angular2-in-memory-web-api": "^0.0.20",
    "bootstrap": "^3.3.7"
  },
  "devDependencies": {
    "typescript": "^2.3.4",
    "typings":"^1.3.2",
    "@types/jasmine": "~2.5.53",
    "@types/jasminewd2": "~2.0.2",
    "@types/node": "~6.0.60",
    "codelyzer": "~3.2.0",
    "jasmine-core": "~2.6.2",
    "jasmine-spec-reporter": "~4.1.0",
    "karma": "~1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-coverage-istanbul-reporter": "^1.2.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.1.2",
    "ts-node": "~3.2.0",
    "tslint": "~5.7.0"
  }
}

express.js.:

var express = require('express')
    ,app = express()
    ,bodyParser = require('body-parser')
    ,routes = require('../app/routes')
    ,path =  require('path');

app.set('clientPath', path.join(__dirname, '../..', 'client'));
console.log(app.get('clientPath'));
app.use(express.static(app.get('clientPath')));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

routes(app);

module.exports = app;

Obrigado desde já pela ajuda neste caso.

João, me explica o porque dessas duas linhas nas suas configurações por favor?

console.log(app.get('clientPath'));
app.use(express.static(app.get('clientPath')));

João, testei o servidor disponibilizado pelo curso aqui e funcionou. Você criou um do zero ou modificou o código? Lembre-se que neste curso focamos apenas o Angular, pois a parte de API é algo totalmente separado do Angular, inclusive há cursos na Alura que podem te guiar nesse sentido.

Como Wanderson apontou, há o erro :

new Error('Can\'t set headers after they are sent.'); ^

Não se pode tentar escrever na resposta depois dela já ter sido enviada, isso em qualquer linguagem, em qualquer servidor.

Flavio,

As configurações do express estão iguais ao servidor do curso. Não consegui ainda identificar em qual parte do código ocorre esta tentativa de gravação na resposta. Segue os arquivos que foram alterados no server

api :

var db = require('../../config/database');

var api = {}

api.adiciona = function(req, res) {
    var parametro = req.body;
    delete parametro._id;
    db.insert(parametro, function(err, newDoc) {
        if(err) return console.log(err);
        console.log('Adicionado com sucesso: ' + newDoc._id);
        res.json(newDoc._id);
    });  
};

api.busca = function(req, res) {
   db.findOne({_id: req.params.parametroId }, function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });
};

api.atualiza = function(req, res) {
    console.log('Parâmetro recebido:' + req.params.parametroId);
    db.update({_id : req.params.parametroId }, req.body, function(err, numReplaced) {
        if (err) return console.log(err);
        if(numReplaced) res.status(200).end();
        res.status(500).end();
        console.log('Atualizado com sucesso: ' + req.body._id);
        res.status(200).end();
    });  
};

api.lista = function(req, res) {
    db.find({}).sort({legado: 1}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({produto: 2}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({subproduto: 3}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({tpoevento: 4}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({familia: 5}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({tpocontrato: 6}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({descevento: 7}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({evprivate: 8}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({eftoposicao: 9}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({eftofinan: 10}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({evcetip: 11}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

    db.find({}).sort({excluirmov: 12}).exec(function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });
};

api.listaPorGrupo = function(req, res) {
    var grupoId = parseInt(req.params.grupoId);
    db.find({grupo: grupoId}, function(err, doc) {
        if (err) return console.log(err);
        res.json(doc);
    });

};

api.remove = function(req, res) {

    db.remove({ _id: req.params.parametroId }, {}, function (err, numRemoved) {
        if (err) return console.log(err);
        console.log('removido com sucesso');
        if(numRemoved) res.status(200).end();
        res.status(500).end();
    });
};

api.listaGrupos = function(req, res) {

    res.json([
        {
            _id: 1, 
            nome: 'legado'
        }, 
        { 
            _id: 2, 
            nome: 'produto', 
        }, 
        { 
            _id: 3, 
            nome: 'subproduto'
        },
        { 
            _id: 4, 
            nome: 'tpoevento'
        },
         { 
            _id: 5, 
            nome: 'familia'
        },
         { 
            _id: 6, 
            nome: 'tpocontrato'
        },
         { 
            _id: 7, 
            nome: 'descevento'
        },
         { 
            _id: 8, 
            nome: 'evprivate'
        },
        { 
            _id: 9, 
            nome: 'eftoposicao'
        },
        { 
            _id: 10, 
            nome: 'eftofinan'
        },
        { 
            _id: 11, 
            nome: 'evcetip'
        },
        { 
            _id: 12, 
            nome: 'excluirmov'
        }
    ]);

};


module.exports = api;

E o route:

var api = require('../api'),
    path = require('path');

module.exports  = function(app) {

    app.route('/v1/parametros')
        .post(api.adiciona)
        .get(api.lista);

    app.route('/v1/parametros/:parametroId')
        .delete(api.remove)
        .get(api.busca)
        .put(api.atualiza);

    app.get('/v1/grupos', api.listaGrupos)
    app.get('/v1/parametros/grupo/:grupoId', api.listaPorGrupo);

    app.all('/*', function(req, res) {
        res.sendFile(path.join(app.get('clientPath'), 'index.html'));
    });
};

Foram apenas acrescentados campos para poder refletir as alterações que efetuei na aplicação.

Dá uma olhada aqui:

api.atualiza = function(req, res) {
    console.log('Parâmetro recebido:' + req.params.parametroId);
    db.update({_id : req.params.parametroId }, req.body, function(err, numReplaced) {
        if (err) return console.log(err);
        if(numReplaced) res.status(200).end();
        res.status(500).end();
        console.log('Atualizado com sucesso: ' + req.body._id);
        res.status(200).end();
    });  
};

Consegue enxergar o problema? Você esta escrevendo na resposta duas vezes!!! Me parece que você esta se enrolando com o if sem bloco. Sugiro colocar bloco em todos os if's que o problema ficará ainda mais evidente para você, tornando-se mais fácil de detectar. Não ficou claro para mim se você domina a parte do backend ou se apenas mudou a parte de backend do curso para atender sua necessidade. Nesse sentido, lembre-se que para trabalhar com Node.js é necessário saber JavaScript.

Sucesso e bom estudo meu aluno!

Flávio, só alterei o back para atender minhas necessidades. Neste trecho do código eu mantive igual ao do servidor do curso, só alterando o nome de fotoId para parametroId.

Se você pegar o projeto original, dá a mesma mensagem? Qual versão do Node.js você esta usando?

Eu executo o comando no projeto original:

MacBook-Pro-de-Flavio:server flavioalmeida$ node server
Banco data.db pronto para uso
/Users/flavioalmeida/Downloads/client
Servidor escutando na porta: 3000

E tudo continua funcionando. Com o projeto original do curso, sem a sua modificação, funciona? Aliás, esse backend não é para ser usado em produção, é um backend simples para ser usado no curso de Angular com o NeDB que jamais deve ser usado em produção. Ele é simples assim porque é o mínimo necessário para que o aluno consiga subir sem problemas na máquina dele e usar no curso de Angular. Não fico surpreso de qualquer alteração sua ter quebrado a API, pois ela é frágil.

Bom, não imaginei que ninguém fosse pegar a API do curso e modificá-la. Então, eu alterei o projeto de download do curso para quem for modificar a API não caia no problema que você caiu.

Nesse sentido, basta você baixar o 01-alurapic.zip do primeiro capítulo do curso e realizar as mudanças que deseja.

Sucesso e bom estudo meu aluno!

Bom Dia Flávio,

Irei fazer o download em casa e irei replicar as alterações que foram feitas e informo o resultado. Com a API do curso não tenho este problema.

Agradeço desde já pela atenção e ajuda de todos.

Obrigado e sucesso para todos.