2016-07-24 6 views
3

ich Kette versucht bin ES6 verspricht mit Mongoose 4.5.4Chaining ES6 Promises in Mongoose mit Typoskript

public static signup(req: express.Request, res: express.Response) { 
    UserModel.findOne({ email: req.body.email }).exec() 
    .then(existingUser => { 
     if(existingUser) { 
      return res.send({ message: 'Email is in use' }); 
     } 

     return UserModel.create({ 
      firstName: req.body.firstName, 
      lastName: req.body.lastName, 
      email: req.body.email, 
      password: req.body.password 
     }); 
    }) 
    .then(user => { 
      return res.send({ token: AuthUtils.createJWT(user)}); 
    }) 
    .catch(err => { 
     console.log(err); 
    }); 
} 

jedoch Typoskript den folgenden Fehler wirft, wenn ich zu return UserModel.create(...) versuchen:

Argument of type '(existingUser: IUser & _Model<IUser> & EventEmitter) => Response | MongoosePromise<IUser & _Model...' is not assignable to parameter of type '(...args: (IUser & _Model<IUser> & EventEmitter)[]) => void | (IUser & _Model<IUser> & EventEmitt...'. Type 'Response | MongoosePromise<IUser & _Model<IUser> & EventEmitter>' is not assignable to type 'void | (IUser & _Model<IUser> & EventEmitter) | PromiseLike<IUser & _Model<IUser> & EventEmitter>'. Type 'Response' is not assignable to type 'void | (IUser & _Model<IUser> & EventEmitter) | PromiseLike<IUser & _Model<IUser> & EventEmitter>'. Type 'Response' is not assignable to type 'PromiseLike<IUser & _Model<IUser> & EventEmitter>'. Property 'then' is missing in type 'Response'.

.create() gibt ein Versprechen, also kann ich nicht sehen, wie das ein Problem wäre.

Jede Hilfe wäre willkommen.

+0

'.Create()' ein Versprechen gibt, aber Sie sind auch 'Rückkehr res.send (...' in einem anderen Zweig Aufruf entweder so 'user' im Finale könnte dann sein. – JohnnyHK

+0

Ah, natürlich. Haben Sie irgendwelche Vorschläge für die effektivste Abhilfe? – Fedoranimus

Antwort

3

Fügen Sie dem vorhandenen Benutzer den Steuerungsfluss hinzu, indem Sie die Antwort des Versprechens mit einem existing-Flag kennzeichnen. Beispiel:

public static signup(req: express.Request, res: express.Response) { 
     UserModel.findOne({ email: req.body.email }).exec() 
     .then(existingUser => { 
      if(existingUser) { 
       return Promise.resolve({ 
       user: existing, 
       existing: true 
       }); 
      } 
      return UserModel.create({ 
       firstName: req.body.firstName, 
       lastName: req.body.lastName, 
       email: req.body.email, 
       password: req.body.password 
      }).then((user) => { 
      return Promise.resolve({ 
       existing: false, 
       user: user 
      }); 
      }); 
     }) 
     .then(response => { 
     if (response.existing) { 
      return res.send({ message: `Email ${response.user.email} is in use` }); 
     } else return res.send({ token: AuthUtils.createJWT(response.user)}); 
     }) 
     .catch(err => { 
      console.log(err); 
     }); 
    } 
+0

Mmh, ich müsste es testen, aber Sie können den Fehler weiterleiten, wenn "vorhanden" ist eins. –

+0

Ich habe den Code bearbeitet, um mehr Kontrolle hinzuzufügen Der Fluss, also Ablehnungen, wird nur durch den "catch" behoben. –

+0

Das sollte funktionieren. Vielleicht ist es einfacher Callbacks in diesem Szenario zu verwenden :-) – JohnnyHK

0

ich eigentlich mein Projekt für ES6 endete Aufbau so, dass ich async/await

verwenden könnte es mir erlaubt, den Code drastisch zu vereinfachen.

public static async signup(req: express.Request, res: express.Response) { 
    try { 
     let user = await UserModel.findOne({ email: req.body.email }).exec() 
     if(user) { 
      throw `Email ${user.email} is in use`; 
     } 
     if(environment.debug) console.log(`Creating new user ${req.body.firstName} ${req.body.lastName} with email ${req.body.email}`); 
     user = await UserModel.create({ 
      firstName: req.body.firstName, 
      lastName: req.body.lastName, 
      email: req.body.email, 
      password: req.body.password 
     }); 
     return res.send({ token: AuthUtils.createJWT(user)}); 
    } catch(e) { 
     console.log(e); 
     res.send({ error: e }); 
    } 
}