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. Καλή μέρα.
