Как исправить ошибку «Не удается прочитать свойство« trim »of undefined» в узле - PullRequest
4 голосов
/ 27 мая 2019

Я реализую простой WebAPI в облачных функциях Firebase с помощью Express от TypeScript. Мой код следующий.

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
}

Сборка для преобразования машинописи в JavaScript работала нормально. Однако, когда я сделал метод POST, произошла следующая ошибка.

>  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)

Как я могу исправить эту ошибку?

Ответы [ 4 ]

1 голос
/ 30 мая 2019

Ваша проблема в том, что isEmpty не готов принимать вещи, которые не являются строками.

Быстрое исправление: установить значение по умолчанию

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

Лучшее решение : проверка ваших данных.

При разработке любого API вам необходимо проверить входные данные по вашему запросу.

Вы работаете на конечной точке API для создания нового пользователя, и вам потребуются некоторые данные вместе с запросом, таким как имя, фамилия, возраст и дата рождения пользователя, которого вы собираетесь создать.Очевидно, что передача Салли в качестве значения для возраста или 53 для даты рождения не приведет к правильному движению вещей.Вы действительно не хотите, чтобы плохие данные попадали в ваше приложение, так что вы делаете?Ответ - проверка данных. Ссылка .

Я приведу быстрый пример для этого случая, используя Joi :

// 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...
0 голосов
/ 27 мая 2019

В JavaScript истинное значение - это значение, которое считается истинным, когда встречается в логическом контексте.Все значения являются достоверными, если они не определены как ложные (т. Е. За исключением false, 0, "", null, undefined и NaN).

так почему вы не можете использовать, как показано ниже?

 if (!text) {
        resText = "Empty"
    }
0 голосов
/ 27 мая 2019

Прежде всего вам нужно понять, почему req.body.text имеет значение null или не определено, а затем выполнить пустую проверку, как показано ниже.

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 голосов
/ 27 мая 2019

Просто отметьте, что str на самом деле пусто в isEmpty Добавьте if(!str) return true к нему.Это будет выглядеть так:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...