我正在创建一个项目。该项目将在创建付款时记录付款详细信息。
import * as fs from 'fs/promises';
import * as path from 'path';
app.use('/files', async (req, res) => {
const filePath = path.join(
`log-files/test_${moment().format('YYYY-MM-DD')}.txt`
);
const value = 'TEST FILE CREATION IN AWS';
try {
await fs.readFile(filePath);
await fs.appendFile(filePath, `\n\n${value}`);
res.status(200).send(`File created in, ${filePath}`);
} catch (error) {
await fs.writeFile(filePath, value);
console.log(error);
res.status(200).send(`File created in, ${filePath}`);
}
});
以上是我尝试过的代码。
这是我创建文件的脚本。它在本地运行良好,但在 AWS CodeCommit 中时, API调用成功并登录
File created in, log-files/test_2024-09-30.txt
但是当我检查存储库下的
log-files
文件夹时,它没有这个文件。
您遇到的问题可能是由于您的本地环境以及 AWS CodeCommit 和部署环境的工作方式之间的差异造成的。这是一个解释和一些建议:
CodeCommit 只是一个版本控制服务: CodeCommit 实际上并不运行您的代码或创建文件。它只是存储您的源代码。
文件系统差异: 当您的代码在 AWS 上运行时(可能在 EC2、ECS 或 Lambda 等服务中),它运行在与本地计算机不同的环境中。那里的文件系统与您的 CodeCommit 存储库是分开的。
临时文件系统: 许多 AWS 服务使用临时文件系统。这意味着在运行时创建的文件在实例或容器停止后不会保留。
权限: 运行代码的进程可能无权写入您指定的目录。
您可以尝试以下一些解决方案:
使用持久存储服务: 考虑使用 Amazon S3 等服务来存储日志文件,而不是写入本地文件系统。这是一个例子:
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import moment from 'moment';
const s3Client = new S3Client({ region: "YOUR_REGION" });
app.use('/files', async (req, res) => {
const fileName = `test_${moment().format('YYYY-MM-DD')}.txt`;
const value = 'TEST FILE CREATION IN AWS';
try {
const command = new PutObjectCommand({
Bucket: "YOUR_BUCKET_NAME",
Key: `log-files/${fileName}`,
Body: value,
});
await s3Client.send(command);
res.status(200).send(`File created in S3: log-files/${fileName}`);
} catch (error) {
console.error(error);
res.status(500).send("Error creating file in S3");
}
});
使用日志服务: 考虑使用 AWS CloudWatch Logs 或第三方日志记录服务,而不是直接写入文件。
检查您的部署: 如果您确实需要写入本地文件系统,请确保您的部署过程包含
log-files
目录,并且您的应用程序对其具有写入权限。
使用特定于环境的路径: 使用环境变量在不同环境下设置不同的日志文件路径:
const logPath = process.env.LOG_PATH || 'log-files';
const filePath = path.join(logPath, `test_${moment().format('YYYY-MM-DD')}.txt`);
调试您的部署: 添加更多日志记录以准确查看文件在部署环境中写入的位置:
console.log(`Attempting to write to: ${path.resolve(filePath)}`);
请记住,在部署到云环境时,直接在应用程序中写入文件通常不是一个好习惯。对于云原生应用程序来说,使用 S3 或专用日志服务等服务通常是更好的方法。