Tengo una función de nube de Google Node.js que ahora intento modularizar en dos módulos js. Funciona bien localmente en mi máquina, pero cuando intento implementarlo en Google, aparece el siguiente error:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: npm ERR! @babel/cli not accessible from data-model
Mi main-function es usar mi módulo data-model través de la siguiente entrada en package.json:
"dependencies": { "@google-cloud/datastore": "^6.1.1", "data-model": "file:../../data-model", ... }, El módulo data-model a su vez, tiene el siguiente paquete.json:
{ "name": "data-model", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "$(gcloud beta emulators datastore env-unset) && export GOOGLE_APPLICATION_CREDENTIALS=\"${GCPPRODFILEPATH}\" && jest --verbose --forceExit", "build": "npx babel src --out-dir dist" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@google-cloud/datastore": "^6.6.2", "@google-cloud/storage": "^5.16.1", "cache-manager-redis-store": "^2.0.0", "difference": "^1.0.2", "gstore-node": "^7.2.6", "ioredis": "^4.28.2", "lodash": "^4.17.21" }, "devDependencies": { "@babel/cli": "^7.16.7", "@babel/core": "^7.16.7", "@babel/plugin-transform-modules-commonjs": "^7.16.5", "@babel/plugin-transform-runtime": "^7.16.5", "@babel/preset-env": "^7.16.5", "jest": "^27.4.5" } }y el index.js para el modelo de datos es solo:
module.exports = Object.assign( {}, require('./dist/garage'), require('./dist/car'), require('./dist/bike'), require('./dist/util/cacheService'), );Soy un novato en npm y babel, pero entendí que cuando construyo un modelo de datos en/dist babel transformaría lo que sea necesario y cuando luego use el módulo de babel de función principal debería estar fuera de la imagen. Claramente mi comprensión es incorrecta, pero ¿dónde?
Finalmente logré resolver esto, me desvié un poco del mensaje de error de babel/cli que lanzó CloudFunction.
El problema era que mi módulo de modelo de datos estaba en otro directorio:
"data-model": "file:../../data-model",
Lo puse dentro de la función principal en su lugar:
"data-model": "file:data-model", y funciona bien para implementar funciones en la nube.
Por qué es así, no tengo ni idea, pero también está documentado en Google Cloud Docs :
El código para este módulo local debe almacenarse en otro lugar que no sea la carpeta node_modules dentro del directorio raíz de su función.