Не удалось развернуть облачную функцию в Firebase

Когда я попытался развернуть эту функцию в Firebase с помощью firebase cli, она выдает ошибку в cli. Что делает эта функция

  1. Проверьте, заблокирован ли данный номер, если он заблокирован, он отправит ответ.
  2. Если номер не отклонен, он проверит, связан ли номер с другой учетной записью, если да, то отправит ответ
  3. если и 1, и 2 ложны, зарегистрируйте пользователя.
exports.register = functions.https.onRequest((request, response) => {

    const db = admin.firestore();

    const user: string = request.body['username'];
    const phone: number = request.body['phone'];
    const password: string = request.body['password'];

    return db.collection('rejectedContacts').where('contact', '==', phone).get()
        .then(snapShot => {
            if (snapShot.size > 0) {
                return response.json(
                    {
                        status: 0,
                        message: `Contact, ${phone} is blocked, please try again with another number`,
                        result: null
                    }
                );
            } else {
                return db.collection('users').where('contacts.phone', '==', phone).get()
                    .then(snapShot => {
                        if (snapShot.size > 0) {
                            return response.json(
                                {
                                    status: 0,
                                    message: `Contact, ${phone} is already assigned with an accont. 
                                        Did you forgot your pasword?`,
                                    result: null
                                }
                            );
                        } else {
                            return db.collection('users').add(
                                {
                                    user: user,
                                    password: password,
                                    isBlocked: false,
                                    joiningDate: Date.now(),
                                    phoneVerified: false,
                                    deleted: false,
                                    contacts:
                                        {
                                            phone: phone
                                        }

                                }
                            ).then((writeResult) => {
                                return response.json(
                                    {
                                        result: `User with ID: ${writeResult.id} added.`
                                    }
                                );
                            });
                        }
                    });
            }
        });
});

Ошибка, которую я получаю в кли, это

=== Deploying to 'functionstest-54bd9'...

i  deploying functions
Running command: npm --prefix $RESOURCE_DIR run lint

> functions@ lint /home/me/Documents/TfmFirebase/functions
> tslint -p tslint.json


ERROR: /home/me/Documents/TfmFirebase/functions/src/index.ts[98, 27]: Shadowed name: 'snapShot'
WARNING: /home/me/Documents/TfmFirebase/functions/src/index.ts[140, 9]: Identifier 'phone' is never reassigned; use 'const' instead of 'let'.
WARNING: /home/me/Documents/TfmFirebase/functions/src/index.ts[141, 9]: Identifier 'password' is never reassigned; use 'const' instead of 'let'.
WARNING: /home/me/Documents/TfmFirebase/functions/src/index.ts[145, 9]: Identifier 'queryRef' is never reassigned; use 'const' instead of 'let'.

npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! functions@ lint: `tslint -p tslint.json`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the functions@ lint script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/me/.npm/_logs/2018-02-13T17_43_10_045Z-debug.log

Error: functions predeploy error: Command terminated with non-zero exit code2

это журнал

    0 info it worked if it ends with ok
1 verbose cli [ '/home/me/.nvm/versions/node/v9.5.0/bin/node',
1 verbose cli   '/home/me/.nvm/versions/node/v9.5.0/bin/npm',
1 verbose cli   '--prefix',
1 verbose cli   '/home/me/Documents/TfmFirebase/functions',
1 verbose cli   'run',
1 verbose cli   'lint' ]
2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'prelint', 'lint', 'postlint' ]
5 info lifecycle functions@~prelint: functions@
6 info lifecycle functions@~lint: functions@
7 verbose lifecycle functions@~lint: unsafe-perm in lifecycle true
8 verbose lifecycle functions@~lint: PATH: /home/me/.nvm/versions/node/v9.5.0/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/home/me/Documents/TfmFirebase/functions/node_module$
9 verbose lifecycle functions@~lint: CWD: /home/me/Documents/TfmFirebase/functions
10 silly lifecycle functions@~lint: Args: [ '-c', 'tslint -p tslint.json' ]
11 silly lifecycle functions@~lint: Returned: code: 2  signal: null
12 info lifecycle functions@~lint: Failed to exec lint script
13 verbose stack Error: functions@ lint: `tslint -p tslint.json`
13 verbose stack Exit status 2
13 verbose stack     at EventEmitter.<anonymous> (/home/me/.nvm/versions/node/v9.5.0/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:285:16)
13 verbose stack     at EventEmitter.emit (events.js:160:13)
13 verbose stack     at ChildProcess.<anonymous> (/home/me/.nvm/versions/node/v9.5.0/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack     at ChildProcess.emit (events.js:160:13)
13 verbose stack     at maybeClose (internal/child_process.js:943:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5)
14 verbose pkgid functions@
15 verbose cwd /home/me/Documents/TfmFirebase
16 verbose Linux 4.10.0-42-generic
17 verbose argv "/home/me/.nvm/versions/node/v9.5.0/bin/node" "/home/me/.nvm/versions/node/v9.5.0/bin/npm" "--prefix" "/home/me/Documents/TfmFirebase/functions" "run" "lint"
18 verbose node v9.5.0
19 verbose npm  v5.6.0
20 error code ELIFECYCLE
21 error errno 2
22 error functions@ lint: `tslint -p tslint.json`
22 error Exit status 2
23 error Failed at the functions@ lint script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 2, true ]

но когда я разделил функцию на три отдельные функции (1. проверить отклоненный контакт, 2. проверить, используется ли номер, 3. зарегистрировать номер), это сработало. Бит, я не хочу делать три вызова для регистрации пользователя, и каждый вызов функции учитывается в облачных функциях.

Кто-нибудь может сказать, что не так с кодом?


person Sony    schedule 13.02.2018    source источник
comment
Не могли бы вы показать весь вывод Firebase CLI? Кажется, вы показываете только некоторые из них. Бьюсь об заклад, есть также сообщения TSLint.   -  person Doug Stevenson    schedule 13.02.2018
comment
@DougStevenson Я обновил свой вопрос полным журналом   -  person Sony    schedule 13.02.2018


Ответы (1)


Хук перед развертыванием TSLint в вашем проекте выдает одну ошибку и три предупреждения:

ERROR: /home/me/Documents/TfmFirebase/functions/src/index.ts[98, 27]: Shadowed name: 'snapShot'
WARNING: /home/me/Documents/TfmFirebase/functions/src/index.ts[140, 9]: Identifier 'phone' is never reassigned; use 'const' instead of 'let'.
WARNING: /home/me/Documents/TfmFirebase/functions/src/index.ts[141, 9]: Identifier 'password' is never reassigned; use 'const' instead of 'let'.
WARNING: /home/me/Documents/TfmFirebase/functions/src/index.ts[145, 9]: Identifier 'queryRef' is never reassigned; use 'const' instead of 'let'.

Вам не нужно исправлять предупреждения, но вы должны исправить ошибку (или отключить хук перед развертыванием TSLint).

Ошибка в первой строке говорит о том, что вы затеняете одно имя переменной другим. Иногда это указывает на ошибку программирования. Переменная snapShot, и вы используете ее дважды, одна вложенная в функцию внутри другой. Вы можете исправить это, изменив имя одного из вариантов использования, чтобы другое не переопределялось.

Вы также можете изменить структуру своих обещаний, чтобы они не были вложенными.

person Doug Stevenson    schedule 13.02.2018
comment
Как я могу реструктурировать эти обещания без вложения? - person Sony; 13.02.2018
comment
Вы можете вернуть обещание из функции then, а затем обработать результат в функции then, которая связана с предыдущей. javascript.info/promise-chaining - person Doug Stevenson; 13.02.2018
comment
Я пройду через это и рефакторинг кода, я Android-разработчик и сейчас пытаюсь изучить веб, и спасибо за поддержку - person Sony; 13.02.2018
comment
Да, я знаю, что ты имеешь в виду. Сделать такой прыжок может быть немного сложно. Поскольку вы используете TypeScript, существует также синтаксис async/await, который значительно упрощает работу с промисами, если вы хотите его изучить. - person Doug Stevenson; 13.02.2018
comment
+1 за этот async/await совет. Я предпочитаю Typescript Javascript, потому что Typescript легко читать и понимать :-) - person Sony; 13.02.2018