You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gulp.js从OneSky拉取翻译文件推至AWS S3遇错求助

解决Gulp脚本中AWS S3推送的NetworkingError: XMLHttpRequest is not defined问题

这个错误的根源很明确:你当前引入的是专为React Native环境设计的AWS SDK版本,它依赖React Native提供的XMLHttpRequest API,但你的Gulp脚本运行在Node.js环境里,Node.js本身并没有这个浏览器/React Native特有的API,所以才会抛出这个网络错误。

下面是具体的修复步骤和代码优化建议:

1. 替换AWS SDK包

首先卸载React Native版本的SDK,安装适用于Node.js环境的标准AWS SDK:

npm uninstall aws-sdk-react-native
npm install aws-sdk --save-dev

然后修改代码中的导入语句,替换成标准包:

// 删掉这行
// const AWS = require('aws-sdk/dist/aws-sdk-react-native')
// 改成这行
const AWS = require('aws-sdk')

2. 修复代码中的其他潜在问题

除了SDK的问题,你的代码还有几个需要调整的地方,避免后续踩坑:

(1)循环变量的作用域问题

原代码中用var locale会导致变量提升,循环内的异步操作可能拿到错误的locale值,改成const即可:

// 把 var 换成 const
for(const locale of TRANSLATION_LANGUAGES) {
  // ... 后续代码
}

(2)异步流程的回调地狱问题

原代码嵌套了多层异步回调,不仅可读性差,还容易出现并发问题。建议改用async/await结合Promise.all来优化:

module.exports = async function() {
  env({ file: '.gulp-env.json' })
  
  for(const locale of TRANSLATION_LANGUAGES) {
    // 使用glob的Promise版本(glob@7+支持)替代回调
    const files = await glob.promise('./locales/' + process.env.ONESKY_BASE_LOCALE + '/*.json')
    
    // 并行处理所有文件的拉取、写入和上传
    await Promise.all(files.map(async (file) => {
      try {
        const content = await pullOneSkyFile(file, locale)
        // 替换根key为当前locale
        const updatedContent = content.replace(process.env.ONESKY_BASE_LOCALE, locale)
        const translationFile = writeFile(file, locale, updatedContent)
        await pushToAmazonS3(translationFile, locale, updatedContent)
      } catch(error) {
        if (error.message === 'Invalid source file') {
          throw new Error(`The file ${file} is not present on OneSky`)
        } else {
          console.error('ERROR:', error)
        }
      }
    }))
  }
}

(3)S3上传函数的错误修正

原上传函数里有未定义的fileStream变量,且上传路径固定为test不合理,优化后的版本:

function pushToAmazonS3(filePath, locale, content) {
  console.log('Pushing the file', path.basename(filePath), 'with locale', locale, 'to Amazon S3...')
  
  AWS.config.update({
    region: process.env.AMAZON_S3_REGION,
    accessKeyId: process.env.AMAZON_S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.AMAZON_S3_SECRET_ACCESS_KEY
  })
  
  const s3 = new AWS.S3();
  const uploadParams = {
    Bucket: 'companion-assets',
    // 用更合理的S3 Key路径,比如按locale分类存储
    Key: `locales/${locale}/${path.basename(filePath)}`,
    Body: content,
    ContentType: 'application/json'
  }
  
  // 也可以返回Promise让async/await处理
  return new Promise((resolve, reject) => {
    s3.putObject(uploadParams, function (err) {
      if (err) {
        console.error('Upload failed for', path.basename(filePath), ':', err)
        reject(err)
      } else {
        console.log('Successfully uploaded', path.basename(filePath), 'to S3 (locale:', locale, ')')
        resolve()
      }
    })
  })
}

做完这些修改后,你的Gulp脚本就能在Node.js环境中正常使用AWS SDK上传文件到S3了,不会再出现XMLHttpRequest is not defined的错误。

内容的提问来源于stack exchange,提问作者ZedTuX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:14