从 JSON 文件中读取数据并将其保存到数据库

时间:2021-07-07 08:36:50

标签: javascript node.js mongodb express mongoose

我正在尝试将 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);
  }
});

1 个答案:

答案 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 问题的主题:)