Проблемы с res.cookie, но не с res.json - PullRequest
0 голосов
/ 04 ноября 2019

Когда я использую res.json() в моем ответе по маршруту POST, все работает нормально. Когда я изменяю ответ на res.cookie(), я сталкиваюсь с MongoDB 11000 Dup Key Error со следующим странным поведением:

  1. Документ корректно сохраняется в MongoDB, но вызов POST XHR, кажется, имеет проблемы, так какконсоль браузера показывает POST . . . - - ms, тогда как обычно она показывает число в миллисекундах, то есть POST . . . -32 ms (даже при том, что все еще показывает код 200).
  2. Чуть позже, после задержки, язатем получите Dup Key Error, поскольку кажется, что маршрут пытается сохранить документ во второй раз.

У меня нет других ошибок консоли ни на передней, ни на задней панели, и, судя по журналу консоли, содержимое файла cookie в порядке.

Есть идеи, что может происходить?

ШАБЛОН

<form #f="ngForm" [formGroup]="userForm" (ngSubmit)="doSignUp(f)">
    <ng-container *ngFor="let key of keyArr; index as i"> 

    <label [hidden]='key[1]'> {{key[2]}}
      <div>
          <input *ngIf="key[1]==='password' type='password' [formControlName]='key[0]' id={{key[0]}} name={{key[0]}}/>
          <input *ngIf="key[1]!=='password' type='text' [formControlName]='key[0]' id={{key[0]}} name={{key[0]}}/>
      </div>
     </label>
    <br/>

    </ng-container>
    <button>Submit</button>

</form>

КОМПОНЕНТ

doSignUp(f: NgForm) {
  this.member.postSignupForm(f).subscribe((res)=>console.log(`RES: ${JSON.stringify(res)}`));
}

AUTH SERVICE (СЛУЖБА ЧЛЕНА)

postSignupForm(f: NgForm): Observable<any> {
    return this.http.post(this.signup_url, f.value);
}

** EXPRESS POST МАРШРУТ (https://localhost:3000/users/sign-up)

 . . . 
 . . . 
 user.save().then(()=> {
    res.json({"foo": "bar"} // EVERYTHING WORKS FINE. 
// IF, INSTEAD of res.json() I USE: res.cookie("SESSIONID", user.generateJWT(), {httpOnly:true, secure:true}); 
// then I get MONGODB DUP KEY ERROR as either front-end or back-end tries to save the same record a second time.

COOKIE MIDDLEWARE

UserSchema.methods.generateJWT = function() {
    const today = new Date();
    const expirationDate = new Date(today);
    expirationDate.setDate(today.getDate() + 60);

    const thisJwt = jwt.sign({
        email: this["authData"].mainEmail.value[this["authData"].mainEmail.value.length-1],
        id: this._id,
        exp: parseInt(expirationDate.getTime() / 1000, 10),
    }, 'secret');
    console.log(`TOKEN: ${JSON.stringify(thisJwt)}`);
    return thisJwt;
}

Есть идеи? Спасибо !!

1 Ответ

0 голосов
/ 04 ноября 2019

В back-end после res.cookie () мне нужно было добавить res.send ('done').

 user.save().then(()=> {
    res.cookie("SESSIONID", user.generateJWT(), {httpOnly:true, secure:true});
    res.send('done');
 } 

В интерфейсе мне нужно было добавить responseType к вызову POST:

postSignupForm(f: NgForm): Observable<any> {
    return this.http.post(this.signup_url, f.value, {responseType: 'text'});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...