Как работает экспорт и импорт JS-файлов для созданных объектов?

#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 , спасибо вам всем за помощь! Я ценю это!