loopbackio / loopbackio/loopback-connector-postgresql
eq object (JSON columns) doesn't work
Personne n'a encore pris cette issue.
- Langage dominant
- JavaScript
- Étoiles
- 118
- Forks
- 184
- Merge moyen
- 1 j 22 h
- PR mergées (30 j)
- 5
Description
Steps to reproduce
- Create a model that has an object column, mapped as a JSON type in PostgreSQL
- Try to do a
findsearching for a full value in that property/column, e.g.const objectValue = {a: 1, b: 2};and thenrepo.find({where: {objectProperty: objectValue}})orrepo.find({where: {objectProperty: {eq: objectValue}}})
Current Behavior
- The
{objectProperty: {eq: value}}is translated down into{objectProperty: value} - This line assumes that, if the value is an object, it must contain exactly one field that must be an operator: https://github.com/strongloop/loopback-connector-postgresql/blob/master/lib/postgresql.js#L654
- It tries to map e.g.
aas an operator name - The
buildExpressionoperator switch hits itsdefaultclause which delegates to the base class inloopback-connector: https://github.com/strongloop/loopback-connector-postgresql/blob/master/lib/postgresql.js#L540-L543 - That base class method has a
switchwith nodefaultclause, so it doesn't throw any errors and just concatenates the column name with the placeholder for the value: https://github.com/strongloop/loopback-connector/blob/master/lib/sql.js#L969 - And so it generates invalid SQL that looks like
"columName"$1
Expected Behavior
- I should be able to use object values in where clauses if the property contains object values
Link to reproduction sandbox
WIP -- NB: encountering this in an LB4 app
Additional information
- Running on
linux x64 12.22.1 npm lsdoesn't work withrush, but usingloopback-connector-postgresqlv5.0.1, withloopback-connectorv4.11.1, and the following LB4 components:"@loopback/boot": "2.2.0""@loopback/context": "3.9.3""@loopback/core": "2.5.0""@loopback/metadata": "2.2.6""@loopback/openapi-v3": "3.3.1""@loopback/openapi-v3-types": "1.2.1""@loopback/repository": "2.4.0""@loopback/rest": "4.0.0""@loopback/rest-explorer": "2.2.0"
Related Issues
Haven't found any yet
Workaround
Create a custom class to represent the value, and then have the equality comparison value use that, e.g. something like this, but without the prototype pollution vulnerabilities:
class JSONWrapper {
[k: string]: any
constructor(value: any) {
Object.assign(this, value)
}
}
// elsewhere:
repo.find({where: {objectProperty: new JSONWrapper(objectValue)}});
This causes the expression.constructor === Object check to fail, and so it doesn't try to unwrap the value
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez dans lib/postgresql.js, aux emplacements d’analyse des opérateurs et de buildExpression cités dans le rapport, puis examinez la logique de base correspondante dans loopback-connector/lib/sql.js. Reproduisez la requête d’égalité sur une colonne JSON avec PostgreSQL et suivez la manière dont la valeur de l’objet devient du SQL. Le travail est terminé lorsque les valeurs d’objet dans les clauses where génèrent du SQL valide et renvoient les enregistrements correspondants, avec une couverture de régression dans les tests pertinents du connecteur.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript, postgresql
- Domaine
- databases
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 48/100