我被下面的场景困住了。这在本地计算机上工作得很好,但是与GCP+NodeJs不工作。
问题-我有一个使用https://www.npmjs.com/package/qr-image生成QR-Images的API,然后它使用https://www.npmjs.com/package/archiver创建zip。归档完成后,它使用nodemailer(https://www.npmjs.com/package/nodemailer)发送邮件。
现在,要存储生成的图像&我使用的是NPM的fs
库。
GCP配置——它是动态的/灵活的应用引擎,节点应用被部署在其中。
mkdir函数给出了问题。我不想用桶来做简单的事情。有没有其他的方法,我可以使用现有的代码没有调整发送邮件使用nodemail(存档文件(qr码)后)?
尝试在本地计算机上运行API。对于使用mailtrap的邮件测试。它似乎运行得很好。但不是GCP。
显然需要一些GCP调整或一些节点/express JS魔法。
触发错误的代码部分-
const codesFolder = 'codes';
if (!fs.existsSync(codesFolder)) {
fs.mkdirSync(codesFolder);
}
GCP日志错误-
2022-11-13 18:48:58 default[20221113t223118] Processing email
2022-11-13 18:48:58 default[20221113t223118] /workspace/node_modules/mysql/lib/protocol/Parser.js:437
2022-11-13 18:48:58 default[20221113t223118] throw err; // Rethrow non-MySQL errors
2022-11-13 18:48:58 default[20221113t223118] ^
2022-11-13 18:48:58 default[20221113t223118] Error: EROFS: read-only file system, mkdir 'codes' at Object.mkdirSync (node:fs:1382:3) at Query.<anonymous> (/workspace/index.js:243:16) at Query.<anonymous> (/workspace/node_modules/mysql/lib/Connection.js:526:10) at Query._callback (/workspace/node_modules/mysql/lib/Connection.js:488:16) at Query.Sequence.end (/workspace/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24) at Query._handleFinalResultPacket (/workspace/node_modules/mysql/lib/protocol/sequences/Query.js:149:8) at Query.EofPacket (/workspace/node_modules/mysql/lib/protocol/sequences/Query.js:133:8) at Protocol._parsePacket (/workspace/node_modules/mysql/lib/protocol/Protocol.js:291:23) at Parser._parsePacket (/workspace/node_modules/mysql/lib/protocol/Parser.js:433:10) at Parser.write (/workspace/node_modules/mysql/lib/protocol/Parser.js:43:10) {
2022-11-13 18:48:58 default[20221113t223118] errno: -30,
2022-11-13 18:48:58 default[20221113t223118] syscall: 'mkdir',
2022-11-13 18:48:58 default[20221113t223118] code: 'EROFS',
2022-11-13 18:48:58 default[20221113t223118] path: 'codes'
2022-11-13 18:48:58 default[20221113t223118] }
应用程序。YAML文件
runtime: nodejs16
env_variables:
# The following environment variables are set for all instances
# of the app.
NODE_ENV : "production"
有一些混淆。你的帖子说你在使用flex环境,但你的评论说标准环境。
如果您使用的是标准,那么您的代码将无法工作,因为标准不允许您写入本地磁盘(请参阅Google文档)
由于@NoCommandLine是正确的,早先我的app.YAML文件不包含env属性。
我在YAML中使用flex进行了一点调整。更新后的YAML如下所示-
runtime: nodejs
env: flex
env_variables:
# The following environment variables are set for all instances
# of the app.
NODE_ENV : "production"
beta_settings:
# The connection name of your instance, available by using
# 'gcloud beta sql instances describe [INSTANCE_NAME]' or from
# the Instance details page in the Google Cloud Platform Console.
cloud_sql_instances: <<<connection_name>>>