#javascript #express #nodes
#javascript #экспресс #узлы
Вопрос:
Я создаю приложение express JS. Я также новичок в javascript. Я использовал c #, но не так много javascript.
У меня есть файл с именем: gcs-config.js Вот содержимое этого файла:
const path = require("path");
const { Storage } = require("@google-cloud/storage");
const serviceKey = path.join(__dirname, "./config/gcs-keys.json");
const projectId = process.env.GGL_PROJECT_ID;
const bucketName = process.env.GGL_BUCKET_NAME;
const storage = new Storage({
keyFilename: serviceKey,
projectId: projectId,
});
exports.storage = storage;
exports.bucketName = bucketName;
как вы можете видеть, я экспортирую класс хранилища и константу;
Я использую это в этом файле под названием gcs-helper.js но он выдает ошибку с надписью null, я не знаю, что не так
const storage = require("../config/gcs-config");
async function uploadFile(targetFolder, filePath, fileName, folderType) {
await storage.bucket(bucketName).upload(filePath, {
// Support for HTTP requests made with `Accept-Encoding: gzip`
gzip: true,
destination: `${folderType}/${targetFolder}/${fileName}`,
metadata: {
// Enable long-lived HTTP caching headers
// Use only if the contents of the file will never change
// (If the contents will change, use cacheControl: 'no-cache')
cacheControl: "public, max-age=31536000",
},
});
exports.uploadFile = uploadFile;
но если я создам экземпляр класса хранилища внутри gcs-helper.js вместо того, чтобы использовать отдельные файлы, тогда это работает. может ли кто-нибудь сказать мне, что не так?
РЕДАКТИРОВАТЬ: я попробовал консольную регистрацию хранилища и получил разные результаты
Вот первый, в котором хранилище находится из другого файла:
STORAGE: {
storage: Storage {
baseUrl: 'https://storage.googleapis.com/storage/v1',
apiEndpoint: 'https://storage.googleapis.com',
timeout: undefined,
globalInterceptors: [],
interceptors: [],
packageJson: {
name: '@google-cloud/storage',
description: 'Cloud Storage Client Library for Node.js',
version: '5.3.0',
license: 'Apache-2.0',
author: 'Google Inc.',
engines: [Object],
repository: 'googleapis/nodejs-storage',
main: './build/src/index.js',
types: './build/src/index.d.ts',
files: [Array],
keywords: [Array],
scripts: [Object],
dependencies: [Object],
devDependencies: [Object]
},
projectId: 'projectares-291618',
projectIdRequired: false,
providedUserAgent: undefined,
makeAuthenticatedRequest: [Function: makeAuthenticatedRequest] {
getCredentials: [Function: bound getCredentials],
authClient: [GoogleAuth]
},
authClient: GoogleAuth {
checkIsGCE: undefined,
jsonContent: null,
cachedCredential: null,
_cachedProjectId: 'projectares-291618',
keyFilename: 'C:\Users\apung\Desktop\ProjectAres\ares-back\config\config\gcs-keys.json',
scopes: [Array],
clientOptions: undefined
},
getCredentials: [Function: bound getCredentials],
acl: {
OWNER_ROLE: 'OWNER',
READER_ROLE: 'READER',
WRITER_ROLE: 'WRITER'
},
getBucketsStream: [Function],
getHmacKeysStream: [Function]
},
bucketName: 'project-ares-bucket'
}
Вот второй вариант, в котором хранилище создается в том же файле
STORAGE: Storage {
baseUrl: 'https://storage.googleapis.com/storage/v1',
apiEndpoint: 'https://storage.googleapis.com',
timeout: undefined,
globalInterceptors: [],
interceptors: [],
packageJson: {
name: '@google-cloud/storage',
description: 'Cloud Storage Client Library for Node.js',
version: '5.3.0',
license: 'Apache-2.0',
author: 'Google Inc.',
engines: { node: '>=10' },
repository: 'googleapis/nodejs-storage',
main: './build/src/index.js',
types: './build/src/index.d.ts',
files: [ 'build/src', '!build/src/**/*.map' ],
keywords: [
'google apis client',
'google api client',
'google apis',
'google api',
'google',
'google cloud platform',
'google cloud',
'cloud',
'google storage',
'storage'
],
scripts: {
predocs: 'npm run compile',
docs: 'jsdoc -c .jsdoc.js',
'system-test': 'mocha build/system-test --timeout 600000 --exit',
'conformance-test': 'mocha build/conformance-test',
'preconformance-test': 'npm run compile',
'presystem-test': 'npm run compile',
test: 'c8 mocha build/test',
pretest: 'npm run compile',
lint: 'gts check',
'samples-test': 'npm link amp;amp; cd samples/ amp;amp; npm link ../ amp;amp; npm test amp;amp; cd ../',
'all-test': 'npm test amp;amp; npm run system-test amp;amp; npm run samples-test',
check: 'gts check',
clean: 'gts clean',
compile: 'tsc -p .',
fix: 'gts fix',
prepare: 'npm run compile',
'docs-test': 'linkinator docs',
'predocs-test': 'npm run docs',
benchwrapper: 'node bin/benchwrapper.js',
prelint: 'cd samples; npm link ../; npm install',
precompile: 'gts clean',
'api-extractor': 'api-extractor run --local',
'api-documenter': 'api-documenter yaml --input-folder=temp'
},
dependencies: {
'@google-cloud/common': '^3.3.0',
'@google-cloud/paginator': '^3.0.0',
'@google-cloud/promisify': '^2.0.0',
arrify: '^2.0.0',
compressible: '^2.0.12',
'concat-stream': '^2.0.0',
'date-and-time': '^0.14.0',
duplexify: '^3.5.0',
extend: '^3.0.2',
gaxios: '^3.0.0',
'gcs-resumable-upload': '^3.1.0',
'hash-stream-validation': '^0.2.2',
mime: '^2.2.0',
'mime-types': '^2.0.8',
onetime: '^5.1.0',
'p-limit': '^3.0.1',
pumpify: '^2.0.0',
snakeize: '^0.1.0',
'stream-events': '^1.0.1',
'xdg-basedir': '^4.0.0'
},
devDependencies: {
'@google-cloud/pubsub': '^2.0.0',
'@grpc/grpc-js': '^1.0.3',
'@grpc/proto-loader': '^0.5.1',
'@types/compressible': '^2.0.0',
'@types/concat-stream': '^1.6.0',
'@types/configstore': '^4.0.0',
'@types/date-and-time': '^0.13.0',
'@types/extend': '^3.0.0',
'@types/mime': '^2.0.0',
'@types/mime-types': '^2.1.0',
'@types/mocha': '^8.0.0',
'@types/nock': '^10.0.0',
'@types/node': '^11.13.4',
'@types/node-fetch': '^2.1.3',
'@types/proxyquire': '^1.3.28',
'@types/pumpify': '^1.4.1',
'@types/sinon': '^9.0.0',
'@types/tmp': '0.2.0',
'@types/uuid': '^8.0.0',
'@types/xdg-basedir': '^2.0.0',
c8: '^7.0.0',
codecov: '^3.0.0',
'form-data': '^3.0.0',
gts: '^2.0.0',
jsdoc: '^3.6.2',
'jsdoc-fresh': '^1.0.1',
'jsdoc-region-tag': '^1.0.2',
linkinator: '^2.0.0',
mocha: '^8.0.0',
nock: '~13.0.0',
'node-fetch': '^2.2.0',
'normalize-newline': '^3.0.0',
proxyquire: '^2.1.3',
sinon: '^9.0.0',
tmp: '^0.2.0',
typescript: '^3.8.3',
uuid: '^8.0.0',
yargs: '^15.0.0',
'@microsoft/api-documenter': '^7.8.10',
'@microsoft/api-extractor': '^7.8.10'
}
},
projectId: 'projectares-291618',
projectIdRequired: false,
providedUserAgent: undefined,
makeAuthenticatedRequest: [Function: makeAuthenticatedRequest] {
getCredentials: [Function: bound getCredentials],
authClient: GoogleAuth {
checkIsGCE: undefined,
jsonContent: null,
cachedCredential: null,
_cachedProjectId: 'projectares-291618',
keyFilename: 'C:\Users\apung\Desktop\ProjectAres\ares-back\config\gcs-keys.json',
scopes: [Array],
clientOptions: undefined
}
},
authClient: GoogleAuth {
checkIsGCE: undefined,
jsonContent: null,
cachedCredential: null,
_cachedProjectId: 'projectares-291618',
keyFilename: 'C:\Users\apung\Desktop\ProjectAres\ares-back\config\gcs-keys.json',
scopes: [
'https://www.googleapis.com/auth/iam',
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/devstorage.full_control'
],
clientOptions: undefined
},
getCredentials: [Function: bound getCredentials],
acl: { OWNER_ROLE: 'OWNER', READER_ROLE: 'READER', WRITER_ROLE: 'WRITER' },
getBucketsStream: [Function],
getHmacKeysStream: [Function]
}
Комментарии:
1. Что выводит console.log(хранилище)?
storage
кстати, во втором фрагменте будет все (все экспортировано в gcs-config), поэтому вам придется написатьstorage.storage.bucket
2. Вот хороший учебник для этого: sitepoint.com/understanding-module-exports-exports-node-js
3. @MauriceNino Я попытался зарегистрировать их оба, и я получил разные результаты, я отредактирую сообщение, чтобы включить результат.
4. @MauriceNino как вы можете видеть, второй файл длиннее, почему это? в чем разница между ними
Ответ №1:
Вы можете импортировать модули указанным ниже способом и пройти через этот сайт https://www.sitepoint.com/understanding-module-exports-exports-node-js / для лучшего понимания экспорта и импорта модулей.
const gcsConfig = require("../config/gcs-config");
async function uploadFile(targetFolder, filePath, fileName, folderType) {
await gcsConfig.storage.bucket(bucketName).upload(filePath, {
// Support for HTTP requests made with `Accept-Encoding: gzip`
gzip: true,
destination: `${folderType}/${targetFolder}/${fileName}`,
metadata: {
// Enable long-lived HTTP caching headers
// Use only if the contents of the file will never change
// (If the contents will change, use cacheControl: 'no-cache')
cacheControl: "public, max-age=31536000",
},
});
exports.uploadFile = uploadFile;
Ответ №2:
Я обнаружил проблему, у меня неверный путь к файлу gcs-helper.js , спасибо вам всем за помощь! Я ценю это!