typescript - Πώς να μετονομάσετε πεδία JSON στο nest.js
Θα ήθελα να μάθω ποιος είναι ο σωστός τρόπος να μετονομάσω ένα πεδίο μόνο για τον απο-σειριοποιητή στο nest.js. Για το δεδομένο αντικείμενο παρακάτω:
export class User {
contact_email?: string;
}
contact_email είναι ένα πεδίο στη βάση δεδομένων μας αλλά έρχεται σε σύγκρουση με τις τρέχουσες εφαρμογές όπου στέλνουμε contactEmail.
Δοκίμασα τις παρακάτω δοθείσες λύσεις:
import { Expose } from 'class-transformer';
export class User {
@Expose({ name: "contactEmail" })
contact_email?: string;
}
Αυτό παραπάνω μετονομάζει το πεδίο καθόλου και όταν χρησιμοποιείται το αντικείμενο, μετατρέπεται σε contactEmail καθόλου, όχι μόνο όταν μετατρέπεται από JSON (string) σε Κλάση. Στη συνέχεια προσπάθησα τη λύση παρακάτω:
import { Transform } from 'class-transformer';
export class User {
@Transform(key => "contactEmail", { toClassOnly: true })
contact_email?: string;
}
Φαίνεται ότι αυτή η περίπτωση δεν λειτουργεί επίσης.
Οι πληροφορίες που προέρχονται από την εφαρμογή:
{
"contactEmail": "[email "
}
Θα ήθελα να κάνω κάτι παρόμοιο με το serde #rename της Rust. Όπου μπορώ να μετονομάσω ένα πεδίο για την σειριοποίηση/αποσειριοποίηση αλλά να κρατήσω το αρχικό όνομα για την εφαρμογή.
Χρησιμοποιούμε nest.js + fastify.js + sequelize.js.
Ευχαριστώ.
Απάντηση #1
Εντάξει, λοιπόν μετά από λίγη έρευνα, έχω μια λύση, αλλά όπως θα δείτε είναι μια άσχημη πάπια/hack 🦆:
@Expose()
@Transform(
({value, obj, type}) => {
console.log(value, obj, type);
if (obj['contact_email']) {
return obj['contact_email'];
} else {
return value;
}
}
)
contactEmail?: string;
Σου κάνει αυτό;
Χρησιμοποιώντας μια τριπλή δήλωση για να το συντομεύσετε λίγο:
@Expose()
@Transform(
({value, obj}) =>
typeof value === 'undefined' ? obj['contact_email'] : value
)
contactEmail?: string;
Πιθανώς θα έπρεπε να ζητήσω διευκρίνιση σχετικά με το έργο class-transform, καθώς υποψιάζομαι ότι αυτό δεν είναι σκόπιμο.
Παρατήρησα ότι αφού έβαλα καταγραφές μέσα στον διακοσμητή @Transform, στην πρώτη διέλευση το value ήταν undefined, αλλά στη δεύτερη διέλευση είχε μια τιμή.
Ξέρω ότι καλείται δύο φορές, νομίζω μία φορά κατά την κλήση της plainToClass, και μετά ξανά κατά τη διάρκεια της σειριοποίησης.
Ελπίζω αυτή η προσωρινή λύση να είναι χρήσιμη ή να προωθήσει το ζήτημα για εσάς.
