我正在使用此代码进行文件更新:
app.post("/UploadFile", function(request, response)
{
var file = request.files.UploadedFile;
var name = request.param("Name");
var componentId = request.param("ComponentId");
console.log("Uploading: " + name);
var parameters =
{
filename: name,
metadata:
{
Type: "Screenshot",
ComponentId: componentId
}
};
grid.files.findOne( { "metadata.ComponentId" : componentId }, function(error, existing)
{
console.log("done finding");
if (error)
{
common.HandleError(error);
}
else
{
if (existing)
{
console.log("Exists: " + existing._id);
grid.remove({ _id: existing._id }, function(removeError)
{
if (removeError)
{
common.HandleError(removeError, response);
}
else
{
SaveFile(file, parameters, response);
}
});
}
else
{
console.log("new");
SaveFile(file, parameters, response);
}
}
});
});
function SaveFile(file, parameters, response)
{
console.log("Saving");
var stream = grid.createWriteStream(parameters);
fs.createReadStream(file.path).pipe(stream);
}
基本上,我正在检查一个 ID 存储在元数据中的文件。如果存在,我会在保存之前将其删除,如果不存在,我就进行保存。它似乎只是偶尔起作用。我有时会看到两种错误行为:
该文件将被删除,但不会重新创建。
该文件似乎已更新,但在我再次调用我的代码之前实际上不会被替换。所以基本上我需要为它做两个文件上传来注册替换。
它非常粗略,我无法真正确定它是否会起作用的模式。
所以我假设我做错了什么。使用 gridfs-stream 替换文件的正确方法是什么?