4
votes

Comment réparer l'erreur "Impossible de lire la propriété 'trim' de l'indéfini" dans le nœud

J'implémente une simple WebAPI dans les fonctions cloud Firebase avec express by TypeScript. Mon code est le suivant.

>  TypeError: Cannot read property 'trim' of undefined
>      at isEmpty (/Users/kenny/Test/firebase_functions/functions/lib/index.js:22:27)
>      at app.post (/Users/kenny/Test/firebase_functions/functions/lib/index.js:9:9)
>      at Layer.handle [as handle_request] (/Users/kenny/Test/firebase_functions/functions/node_modules/expr
ess/lib/router/layer.js:95:5)
>      at next (/Users/kenny/Test/firebase_functions/functions/node_modules/express/lib/router/route.js:137:
13)
>      at Route.dispatch (/Users/kenny/Test/firebase_functions/functions/node_modules/express/lib/router/rou
te.js:112:3)
>      at Layer.handle [as handle_request] (/Users/kenny/Test/firebase_functions/functions/node_modules/expr
ess/lib/router/layer.js:95:5)
>      at /Users/kenny/Test/firebase_functions/functions/node_modules/express/lib/router/index.js:281:22
>      at Function.process_params (/Users/kenny/Test/firebase_functions/functions/node_modules/express/lib/r
outer/index.js:335:12)
>      at next (/Users/kenny/Test/firebase_functions/functions/node_modules/express/lib/router/index.js:275:
10)
>      at expressInit (/Users/kenny/Test/firebase_functions/functions/node_modules/express/lib/middleware/in
it.js:40:5)

Construire pour transformer du typecript en javascript a bien fonctionné. Cependant, lorsque j'ai utilisé la méthode POST, l'erreur suivante s'est produite.

import * as functions from 'firebase-functions';
import * as express from 'express';

const app = express()

app.post('/', (req, res) => {
    var resText: string = "NotEmpty"
    const text: string = req.body.text

    if (isEmpty(text)) {
        resText = "Empty"
    }
    console.log("text: ", text)
    console.log("resText: ", resText)
    res.send("Echo " + resText)
})

exports.api = functions.https.onRequest(app)


const isEmpty = (str: string): boolean => {
    console.log("str: ", str, "+++")
    const trimedStr = str.trim()
    const result = (trimedStr === null || trimedStr === "")
    console.log("result: ", result)
    return result
}

Comment puis-je corriger cette erreur?


2 commentaires

On dirait que le texte est vide. Le type de contenu est-il du texte?


La variable 'text' ne contient rien, car 'req.body.text' a une valeur indéfinie. Vérifiez auprès de votre 'req.body' s'il a de la valeur ou non.


4 Réponses :


0
votes

Il suffit de vérifier si str est réellement vide dans isEmpty Ajoutez if (! Str) return true . Cela ressemblera à ceci:

const isEmpty = (str: string): boolean => {
    console.log("str: ", str, "+++")
    if(!str) return true;
    const trimedStr = str.trim()
    const result = (trimedStr === null || trimedStr === "")
    console.log("result: ", result)
    return result
}


0 commentaires

0
votes

En JavaScript, une valeur de vérité est une valeur considérée comme vraie lorsqu'elle est rencontrée dans un contexte booléen. Toutes les valeurs sont vraies à moins qu'elles ne soient définies comme fausses (c'est-à-dire, à l'exception de false, 0, "", null, undefined et NaN).

Alors pourquoi ne pouvez-vous pas utiliser comme ci-dessous?

 if (!text) {
        resText = "Empty"
    }


0 commentaires

1
votes

Tout d'abord, vous devez voir pourquoi req.body.text est nul ou non défini, puis vous effectuez la vérification vide comme ci-dessous.

const isEmpty = (str: string): boolean => {
    console.log("str: ", str, "+++")
    const result = (!str || str.toString().trim() === ""); // converting toString because there chance body.text can be a number
    console.log("result: ", result)
    return result
}


0 commentaires

1
votes

Votre problème est que isEmpty n'est pas prêt à recevoir des éléments qui ne sont pas une chaîne.

Solution rapide: définissez une valeur par défaut

// code...

const schema = {
    text: Joi.string()
};

app.post('/', (req, res) => {
    //my code starts here
    const data = req.body;
    const {error, value} = Joi.validate(data, schema);

    if(error) {
        return res.status(400).json(error);
    }
    // ends here


    var resText: string = "NotEmpty"
    const text: string = req.body.text

    if (isEmpty(text)) {
        resText = "Empty"
    }
    console.log("text: ", text)
    console.log("resText: ", resText)
    res.send("Echo " + resText)
});

// code...

Meilleure solution : validez vos données.

Lors du développement d'une API, vous devez valider les données d'entrée de votre demande.

Vous travaillez sur un point de terminaison d'API pour créer un nouvel utilisateur et vous aurez besoin de certaines données avec la demande comme le prénom, le nom, l'âge et la date de naissance de l'utilisateur que vous êtes sur le point de créer. De toute évidence, passer Sally comme valeur pour l'âge ou 53 pour la date de naissance ne fera pas avancer les choses dans la bonne direction. Vous ne voulez vraiment pas que de mauvaises données pénètrent dans votre application, alors que faites-vous? La réponse est la validation des données. Référence .

Je vais faire un exemple rapide pour ce cas en utilisant Joi : p>

const isEmpty = (str=''): boolean => {
    // code...
}


0 commentaires