gpt4 book ai didi

node.js - 同步机制在本地计算机上运行良好,但会删除 Heroku 上的所有视频

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:26 25 4
gpt4 key购买 nike

我有一个在启动时运行的机制,该机制将删除任何孤立的数据。它遍历 mongodb 视频集合并检查以确保它可以将数据库中的记录与磁盘上的相应文件相匹配。如果它发现孤立记录,则会将其删除。然后它翻转并遍历目录以确保找到的所有文件在数据库中都有匹配的记录。

当我在本地计算机上运行它时,它运行完美。然而,每次我部署到heroku并且我的dyno重新启动时,整个“视频”集合都会被删除。

我做了一些基本测试,在 Heroku 中创建视频后,它位于数据库中并且可供下载。我猜 Heroku 不喜欢 fs.access 的某些内容。

任何帮助或见解将不胜感激。

walkVideos: function() {
// First let's lookup videos and make sure there is a directory for them. If not, delete it from the db.
Video.find().exec(function(err, result) {
if (err) {
console.log(err);
return null;
}
if (result.length === 0) {
console.log('No videos found in db');
return null;
}
_.forEach(result, function(video) {
// make sure I can access the style file.
fs.access(scormifyConfig.videoBasePath + video._id + '/dist/' + video._id + '_' + video.filename + '.zip', function(err) {
if (err && err.code === 'ENOENT') {
//Can't find the style file, i need to delete it
Video.remove({_id: video._id}, function(err, result) {
if (err) {
console.log('Error removing video from the db');
}
if (result) {
console.log('Out of sync video pruned from the db');
}
});
}
});
// console.log('Matched video from DB to disk. No action.');
});
});
// let's walk the other way and make sure all videos found on disk have a match in the db at the folder level.
fsp.traverseTreeSync(scormifyConfig.videoBasePath, // walk through the content directory
function(file) {
},
function(dir) {
let _id = dir.replace('content\\videos\\', ''); // on dir, trim to just the id. this can be matched to the DB _id field.
Video.find({_id: _id}, function(err, result) {
if (err) {
console.log(err);
}
if (result.length === 0) { // didn't find the video.
console.log('video found on disk, but not in the db. Removing from disk.');
fs.removeSync(scormifyConfig.videoBasePath + _id, function(err) {
if (err) {
console.log(err);
}
});
}
//console.log('Video matched from disk to DB. No action');
});
},
function() {
console.log('done checking videos.');
});
}

编辑

我做了一些额外的调试。我仍然不确定为什么会发生这种情况,看起来应该有效。

Jul 14 14:40:37 scormify app[web]  { [Error: ENOENT: no such file or directory, access './content/videos/5787f91a9332950300d85ad4/dist/5787f91a9332950300d85ad4_da-dka-dlk-lsk.zip']
Jul 14 14:40:37 scormify app[web] errno: -2,
Jul 14 14:40:38 scormify app[web] Out of sync video pruned from the db

最佳答案

Dynos 拥有 Heroku 所说的“临时文件系统”。换句话说,它在部署中并不持久。请参阅https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem

所以您所看到的是正常行为,尽管现在对您来说非常不方便。其背后的原因是,当您开始增加应用程序运行的测功机数量时,测功机本地的文件系统将无法扩展。它还打破了测功机是一次性的原则。

建议的替代方案是将视频等文件存储在更适合此目的的其他服务上,例如亚马逊 S3。

关于node.js - 同步机制在本地计算机上运行良好,但会删除 Heroku 上的所有视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38384197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com