使用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
相关产品推荐
相关产品推荐

