我正在尝试将 JSON 文件上传到我的 Express 应用程序,从 JSON 文件中读取数据并将其另存为我的 MongoDB 数据库中的新文档。 文档被保存但字段没有被添加,这是由于某些原因未定义字段,我该如何解决这个问题?
当我 console.log(obj)
时,我可以看到数据,但是当我 console.log(obj['DataSource_Name'])
时,例如我不确定为什么?
app.post("/upload-config", uploads.single("txt"), async (req, res) => {
// Read the file and send to the callback
fs.readFile(req.file.path, handleFile);
let obj;
// Write the callback function
function handleFile(err, data) {
try {
obj = JSON.parse(data);
console.log(obj["DataSource_Name"]);
} catch (err) {
console.log(err);
}
}
const config = new ConfigM({
DataSource_Name: obj.DataSource_Name,
DataSource_ID: obj.DataSource_ID,
DataSource_Type: obj.DataSource_Type,
DataSource_ICON: obj.DataSource_ICON,
DoubleQuotes_Text: obj.DoubleQuotes_Text,
Delimeter: obj.Delimeter,
Field_list: obj.Field_list,
});
try {
await config.save();
res.send(obj);
} catch (err) {
console.error(err);
}
});
答案 0 :(得分:1)
obj
只会在 fs.readFile
准备好时才被定义,而不会在您调用它时立即定义。那是异步发生的。因此,在调用 fs.readFile()
后,代码继续执行,创建配置对象,而 obj
仍未定义。
如果您想像这里一样使用回调函数,您可能希望您的配置创建、config.save()
和 res.send(obj)
成为 readFile 回调的一部分。也许在重构之前尝试一下,您可以简单地在最后一次捕获的 }
之后移动结束 }
。
app.post("/upload-config", uploads.single("txt"), async (req, res) => {
// Read the file and send to the callback
fs.readFile(req.file.path, handleFile);
let obj;
// Write the callback function
function handleFile(err, data) {
try {
obj = JSON.parse(data);
console.log(obj["DataSource_Name"]);
} catch (err) {
console.log(err);
}
const config = new ConfigM({
DataSource_Name: obj.DataSource_Name,
DataSource_ID: obj.DataSource_ID,
DataSource_Type: obj.DataSource_Type,
DataSource_ICON: obj.DataSource_ICON,
DoubleQuotes_Text: obj.DoubleQuotes_Text,
Delimeter: obj.Delimeter,
Field_list: obj.Field_list,
});
try {
await config.save();
res.send(obj);
} catch (err) {
console.error(err);
}
}
});
当您从帖子中获取文件时,我不确定您通过本地读取文件究竟在做什么。请注意,您将需要更多的安全保护,并且不接受请求中的路径名来决定服务器上的路径名。但我想这是另一个 stackoverflow 问题的主题:)