2017-06-20 2 views
5

Ich baue eine NodeJS App Fluss verwenden, und ich brauche die Standard-Express-Anmerkung für Express $ Antrag zu verlängern anderen Bereichen aufzunehmen, die ich auf, wie .user und .session heften.erstreckt ausdrücklichen Wunsch Klasse im Flow

leider, wenn ich versuche, dies zu tun und Middleware erstellen, die diese neue Art der Anfrage akzeptiert, flippt ausfließen und ich bin nicht sicher, was ich falsch mache.

der ursprüngliche Code für Express von Flow typisierte ist:

declare class express$Request extends http$IncomingMessage mixins express$RequestResponseBase { 
    .... 
} 

declare type express$Middleware = 
    ((req: express$Request, res: express$Response, next: express$NextFunction) => mixed) | 
    ((error: ?Error, req: express$Request, res: express$Response, next: express$NextFunction) => mixed); 

so würde ich dachte, dass ich nur ausdrücklich $ Antrag verlängern und dann sollten alle meine Middleware mit den neuen Eigenschaften arbeiten, nicht wahr?

declare class web$Request extends express$Request { 
    user: any, 
    isAuthenticated(): boolean, 
    session: { 
     loginForwardUrl: ?string, 
    }, 
} 

const authenticationMiddleware: express$Middleware = (
    req: web$Request, res, next 
): mixed => { 
    if (req.isAuthenticated()) { 
    return next(); 
    } 

    req.session.loginForwardUrl = req.originalUrl; 
    return res.redirect('/auth/login/google'); 
} 

leider ergibt sich der Super-Komplex Fehler:

function 
This type is incompatible with 
union: function type(s): web/src/index.js:113 
Member 1: 
function type: flow-typed/npm/express_v4.x.x.js:97 
Error: 
web$Request: web/src/index.js:114 
This type is incompatible with the expected param type of 
express$Request: flow-typed/npm/express_v4.x.x.js:97 
Member 2: 
function type: flow-typed/npm/express_v4.x.x.js:98 
Error: 
web$Request: web/src/index.js:114 
This type is incompatible with an argument type of 
null: flow-typed/npm/express_v4.x.x.js:98 

kann jemand erklären, was hier vor sich geht und wie man es beheben?

danke!

Antwort

3

Der Fehler sagt, dass ein Argument/param vom Typ express$Request (Mitglied 1) oder null (Mitglied 2) wurde erwartet, aber web$Request wurde gesehen.

Leider Fluss nicht unterstützt erstreckt/zwingender Fluss/lib-Typen:

https://github.com/facebook/flow/issues/396

Was ich zu tun begonnen ist:

  1. flow-typed install [email protected]
  2. Verschieben express_v4.x.x.js von Flow -typed/npm/in Fließtext/(außerhalb Fließtyp/npm/so wird es nicht durch zukünftige flow-typed Installationen überschrieben, und innerhalb Flow-typed/so fließen wird automatischmachenAussagen global)
  3. Direkt unterhalb der declare class express$Request... (so ist es leicht zu finden und so darüber ist, wo es in declare module... verwendet wird, habe ich:

    declare class express$Request extends express$Request { user: any; isAuthenticated(): boolean; session: { loginForwardUrl: ?string; }; }

ich dies tun, anstatt meine des Setzens benutzerdefinierte Requisiten auf der ursprünglichen Klasse, so dass es einfach ist zu sehen, welche Requisiten sind benutzerdefinierte.

+1

oof, brutal - ich wünschte, dass Fluss dies besser unterstützen würde. Danke! – user358829

0

Wenn Sie nur Felder zu der Anfrageklasse hinzufügen möchten, können Sie es wie folgt erweitern. Funktioniert auf [email protected] und später (ich bin nicht sicher, wann diese eingeführt wurde):

declare class session$Request extends express$Request { 
    product: ProductDoc; 
    ip: number; // this will not work - error: [flow] number (This type is incompatible with string) 
} 

/** 
* GET /api/products/:uuid - Get product 
* 
* @property {string} req.params.uuid - The unique id of the product. 
*/ 
function get(req: session$Request, res: express$Response) { 
    // retrieve product from DB ... 
    return res.json({ data: req.product }); 
} 
+0

Ja, beachte, dass @ user358829 dies bereits mit ihrer 'web $ Anfrage 'versucht hat. Das Problem ist, dass der Flow-Def für Express-Middleware 'Express $ Request', nicht' Web $ Request' erwartet –

Verwandte Themen