Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

restify.createJsonClient is not a function

Olá pessoal, estou com esse problema na aula 3 no vídeo 6 - implementando cliente REST, pois ao rodar o comando curl:

curl http://localhost:3000/pagamentos/pagamento -X POST -v -H "Content-type: application/json" -d @files/pagamento.json | json_pp

Aparece o erro :

C:\wamp64\www\projects\git\github\payfast\payfast\node_modules\mysql\lib\protocol\Parser.js:80
        throw err; // Rethrow non-MySQL errors
        ^

TypeError: restify.createJsonClient is not a function
    at new CartoesClient (C:\wamp64\www\projects\git\github\payfast\payfast\servicos\clienteCartoes.js:4:27)

Já tentei as soluções dos links:

https://cursos.alura.com.br/forum/topico-restify-createjsonclient-is-not-a-function-42709

https://cursos.alura.com.br/forum/topico-createjsonclient-is-not-a-function-42466

Mas não tive sucesso, meus arquivos estão assim: package.json do payfast:

{
  "name": "payfast",
  "version": "1.0.0",
  "description": "um gateway para pagamento através de recursos http.",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "gateway",
    "pagamentos",
    "api"
  ],
  "author": "brunogaudino",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.17.2",
    "consign": "^0.1.5",
    "express": "^4.15.3",
    "express-validator": "^3.2.1",
    "jspdf": "^1.3.3",
    "mysql": "^2.13.0",
    "restify": "^5.0.1",
    "restify-clients": "^1.5.0"
  }
}

O if no arquivo pagamentos.js:

  if (pagamento.forma_de_pagamento == 'cartao') {

          var cartao = req.body["cartao"];
          console.log("cartao--> " + cartao);

          var clienteCartoes = new app.servicos.clienteCartoes();

          clienteCartoes.autoriza(cartao,
            function(exception, request, response, retorno){
              console.log("retorno-> " + retorno);
              res.status(201).json(retorno);
              return;
          });

        }

O arquivo em servicos/clienteCartoes.js:

var restify = require('restify');

function CartoesClient(){
  this._cliente = restify.createJsonClient({
    url: 'http://localhost:3001',
    version: '~1.0'
  });
}

CartoesClient.prototype.autoriza = function(cartao, callback){
  this._cliente.post('/cartoes/autoriza', cartao, callback);
}

module.exports = function(){
  return CartoesClient;
}

Podem me ajudar? Precisam de mais alguma informação?

6 respostas

Olá, Bruno Gaudino.

Dá um console.log na variável que retorna o erro quando você executa a query no mysql?

Eu dei um console log no exception dentro do método autoriza, mas não está caindo nele, no console aparece esse erro:

C:\wamp64\www\projects\git\github\payfast\payfast\node_modules\mysql\lib\protocol\Parser.js:80
        throw err; // Rethrow non-MySQL errors
        ^
TypeError: restify.createJsonClient is not a function
    at new CartoesClient (C:\wamp64\www\projects\git\github\payfast\payfast\servicos\clienteCartoes.js:4:27)

Eu também estou com o mesmo erro.

mesmo erro aqui...

Bruno e todos que estão com o problema. Desde a criação curso esses módulos mudaram. Sabemos que os módulos do npm podem mudar a qualquer momento, por isso, aconselho sempre dá uma olhada na documentação.

Para resolver esse problema não use mais o restify e sim restify-clients. Atualmente o restify é usado para prover servidores http.

npm install restify-clients --save

e depois:

var restify = require('restify-clients');

var client = restify.createJsonClient({
    url: 'http://localhost:3001'
});

client.post('/cartoes/autoriza', function(error, req, res, retorno) {
    console.log('Consumindo serviços de cartões');
    console.log(retorno);
});

saída:

Consumindo serviços de cartões
[ { param: 'numero',
    msg: 'Número é obrigatório e deve ter 16 caracteres.' },
  { param: 'numero',
    msg: 'Número é obrigatório e deve ter 16 caracteres.' },
  { param: 'bandeira', msg: 'Bandeira do cartão é obrigatória.' },
  { param: 'ano_de_expiracao',
    msg: 'Ano de expiração é obrigatório e deve ter 4 caracteres.' },
  { param: 'ano_de_expiracao',
    msg: 'Ano de expiração é obrigatório e deve ter 4 caracteres.' },
  { param: 'mes_de_expiracao',
    msg: 'Mês de expiração é obrigatório e deve ter 2 caracteres' },
  { param: 'mes_de_expiracao',
    msg: 'Mês de expiração é obrigatório e deve ter 2 caracteres' },
  { param: 'cvv',
    msg: 'CVV é obrigatório e deve ter 3 caracteres' },
  { param: 'cvv',
    msg: 'CVV é obrigatório e deve ter 3 caracteres' } ]
solução!

Após instalar a biblioteca restify-clients, consegui sucesso utilizando da seguinte forma no arquivo servicos/clienteCartoes.js

// var restify = require('restify');
var restify = require('restify-clients');

function CartoesClient(){
    this._cliente = restify.createJsonClient({
        url: 'http://localhost:3001'
    });
}

CartoesClient.prototype.autoriza = function(cartao, callback){
    this._cliente.post('/cartoes/autoriza', cartao,  callback);
}

module.exports = function(){
    return CartoesClient;
}