Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

'Cast to ObjectID failed for value "" at path "_id"'

Olá,

Eu estou misturando o curso de MEAN com o Curso de Angular2 para estudar um pouco mais, com isso estou tendo alguns problemas.

Eu estou recebendo o seguinte erro ao tentar fazer o cadastro de um usuário:

          at Function.create (C:\GitHub\eSports-team\Back\node_modules\mongoose\lib\model.js:1815:17)
          at adiciona (C:\GitHub\eSports-team\Back\app\api\usuario.js:5:9)
        message: 'Cast to ObjectID failed for value "" at path "_id"',
        name: 'CastError',
        stringValue: '""',
        kind: 'ObjectID',
        value: '',
        path: '_id',
        reason: [Object] } },
  message: 'Usuario validation failed',
  name: 'ValidationError' }

Bom, pelo que entendi ele esta com problema para converter algo para o _id. Estranho porque estou fazendo um post sem enviar _id, que seria criado pelo mongoose/mongo.

O meu formulario está assim:

<form novalidate #meuForm="ngForm" (submit)="cadastrar($event)">
       <div class="form-group row">
            <label for="login">Nome:</label>
            <input required name="login" #login="ngModel" [(ngModel)]="usuario.login" minlength="3" maxlength="6" type="text" class="form-control" id="login" placeholder="Seu login...">
        </div>

        <div class="form-group row">
            <label for="senha">Senha:</label>
            <input required name="senha" #senha="ngModel" [(ngModel)]="usuario.senha" type="password" class="form-control" id="senha" placeholder="Sua senha...">
        </div>

        <div class="form-group row">
            <label for="nome">Nome completo</label>
            <input required name="nome" #nome="ngModel" [(ngModel)]="usuario.nome" type="text" class="form-control" id="nome" placeholder="Seu nome...">
        </div>

        <div class="row">
            <div class="col">
            <button [disabled]="meuForm.form.invalid" type="submit" class="btn btn-primary btn-lg btn-block">Cadastrar </button> 
            </div>
        </div>
    </form>

Estou fazendo ele baseado em validação por template, ainda não me acostumei com a validação por modelo.

Ele chama o seguinte função no componente:

export class CadastroUsuarioComponent implements OnInit {

  usuario: UsuarioComponent = new UsuarioComponent();

  constructor( private service: UsuarioService, private router: ActivatedRoute) { 
    this.service = service;
    this.router = router;
  }

  ngOnInit() {
  }

  cadastrar(){

    this.service.cadastrar(this.usuario)
      .then(res => {
        this.usuario = new UsuarioComponent();
      })
      .catch(erro => console.log(erro));

  }

}

Esse aqui é o serviço:

cadastrar(usuario: UsuarioComponent): Promise<any> {
      if(usuario._id){
          return this.http.put(this.url + '/' + usuario._id, JSON.stringify(usuario),
            { headers: this.headers })
            .toPromise()
                .then(res => res.json())
                .catch();
      } else {
          return this.http.post(this.url, JSON.stringify(usuario),
          { headers: this.headers })
          .toPromise()
            .then(res => res.json())
            .catch();
      }
  }

Detalhe, eue stou utilizando .toPromisse(Acho que o problema pode está aqui.

Posso colocar tambem o Modelo(Mongoose) e a código da rota do Express.

1 resposta
solução!

O problema foi devido a falta da criação dos atributos do componente Usuario no Angular.

Ficou dessa forma:

import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core';

@Component({
  selector: 'app-usuario',
  templateUrl: './usuario.component.html',
  styleUrls: ['./usuario.component.css']
})
export class UsuarioComponent implements OnInit {

  @Input() _id: string;
  @Input() login: string;
  @Input() senha: string;
  @Input() nome: string;

  constructor() { }

  ngOnInit() {
  }

}