javascript - Λήψη δεδομένων χρήστη στο request.user χρησιμοποιώντας express και typescript


Προσπαθώ να δημιουργήσω ένα middleware για να εξασφαλίσω ότι ο χρήστης είναι διαχειριστής, αλλά όταν εκτυπώνω request.customer, το αποτέλεσμα είναι undefined.

Αυτό κάνω:

import { NextFunction, Request, Response } from "express";

import { prisma } from "../../prisma";

export async function ensureAdmin(
  request: Request,
  response: Response,
  next: NextFunction
) {
  const { id } = request.customer;
  const customer = await prisma.customer.findUnique({
    where: {
      id,
    },
  });

  console.log(request.customer);

  return next();
}

request.customer επιστρέφει αυτό: Η ιδιότητα 'customer' δεν υπάρχει στον τύπο 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>' Οπότε δηλώσα το namespace του express προσθέτοντας το αναγνωριστικό πελάτη, όπως αυτό:

declare namespace Express {
  export interface Request {
    customer: {
      id: string;
    }
  }
}

Δεν έχω λάθη αλλά ταυτόχρονα όταν εκτυπώνω request.customer εμφανίζεται ως undefined.

Απάντηση #1

Νομίζω ότι χρειάζεται να υλοποιήσεις σωστά το middleware όπως περιγράφεται σε αυτή την τεκμηρίωση: Χρήση middleware.

Εκεί θα έχετε τη συνάρτηση (req, res, next). Το req είναι τύπου Request και περιέχει παραμέτρους για παραμέτρους ερωτήματος (που καλούνται μέσω req.params), επικεφαλίδες (που καλούνται μέσω req.headers['...']) και πολλά άλλα. Όπου κι αν κωδικοποιείται το αναγνωριστικό του πελάτη σας, πρέπει να το εξάγετε από το αίτημά σας.

Απάντηση #2

Μόλις βρήκα έναν τρόπο να πω στο TypeScript πώς να καταλάβει το αντικείμενο request με νέες ιδιότητες πάνω του. Αυτός είναι ο τρόπος:

interface AuthRequest extends Request {
    customer: string
}

const auth = async (req: AuthRequest, res: Response, next: NextFunction) => {
    // Do you staff here...and then add customer to req object
    req.customer = 'id of administrator user'
    next()
}

Τερματισμός, πρέπει να επεκτείνετε τη διεπαφή Express Request με τις δικές σας προσαρμοσμένες ιδιότητες και στη συνέχεια να χρησιμοποιήσετε αυτή τη νέα διεπαφή αντί της διεπαφής Express Request. Καλή μέρα.