【问题标题】:How to post a javascript array to MongoDB from react app?如何从反应应用程序将 javascript 数组发布到 MongoDB?
【发布时间】:2020-06-14 08:44:25
【问题描述】:

我是一名初学者,正在学习更多关于 react 和 mongoDB 的知识,但我在两者之间的交流遇到了一些麻烦。我一直在关注tutorial on Medium 使用 Plaid API 从用户那里获取历史交易数据 (here's the tutorial codebase used)。虽然用户的银行账户和用户个人资料信息存储在 mongoDB 后端,但交易数据却没有。取而代之的是,每次用户登陆某个页面时都会进行一次 API 调用,并将交易数据转换为一个数组,该数组显示在用户前端的数据表中。

这位于上面链接的教程代码库中 Accounts.js 文件的第 56 行(文件位于此目录中:client\src\components\dashboard)

// Setting up data table
    const transactionsColumns = [
      { title: "Account", field: "account" },
      { title: "Date", field: "date", type: "date", defaultSort: "desc" },
      { title: "Name", field: "name" },
      { title: "Amount", field: "amount" },
      { title: "Category", field: "category" }
    ];
let transactionsData = [];
    transactions.forEach(function(account) {
      account.transactions.forEach(function(transaction) {
        transactionsData.push({
          account: account.accountName,
          date: transaction.date,
          category: transaction.category[0],
          name: transaction.name,
          amount: transaction.amount
        });
      });
    });

我想做的是将此数组发布到我已连接的 mongoDB 中 - 否则我将永远无法看到用户拉入的任何事务数据。我认为我应该做的是在名为 Transactions.js 的模型中创建一个新的 js 文件。目前在模型文件夹(在父目录中)有一个 Account.js 文件和一个 User.js 文件,它们为每个数据集设置架构。我在想 Transactions.js 看起来像这样(与上面发布的数组格式一致):

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const TransactionSchema = new Schema({
  userId: {
    type: Schema.Types.ObjectId, // how we associate each transaction with a user
    ref: "users"
  },
  accessToken: {
    type: String,
    required: true
  },
  itemId: {
    type: String,
    required: true
  },
  account: {
    type: String
  },
  date: {
    type: Date
  },
  name: {
    type: String
  },
  amount: {
    type: String
  },
  category: {
    type: String
  },
});

module.exports = Transaction = mongoose.model("transaction", TransactionSchema);

但是从那里我不确定如何将 transactionsData 数组发布到此架构中。理想情况下,我希望它在每次用户点击 API 时发布,并且仅在 TransactionSchema 不存在的情况下添加项目。

我的一个相关问题是,从 mongoDB 调用数据时,在前端向用户呈现特定数据的最有效方法是什么?例如,上面引用的同一 Accounts.js 文件在第 76 行包含以下内容:

<b>Welcome, {user.name.split(" ")[0]}</b>

它的作用是获取在注册期间输入的用户全名,然后将其转换为名字。在我看来,这是在引用模型中的 User.js 文件并查询名称字段。但是,当我将其更改为 User.js 中的另一个字段(例如电子邮件)并使用相同的代码约定 {user.email} 时,我看不到任何结果。

感谢您的帮助!

【问题讨论】:

    标签: javascript reactjs mongodb plaid


    【解决方案1】:

    你可以这样做

    let Transaction = require("./model/Transaction.js") // whatever file your transaction schema is stored in
    
    
    // do this is in the same place you create the transactionData from the transactionData array
    transactionData.foreach(async data => {
        const newTransaction = new Transaction(data)
        await newTransaction.save()
    })
    

    这将为您的transactionData 数组中的每个事务创建一个新的事务架构实例并将其保存到数据库中

    【讨论】:

    • 嗯,我继续收到此错误:Module not found: Can't resolve '../../models/Transaction.js' in 'mern-plaid\client\src\components\dashboard',这似乎是有史以来最无用的错误消息。我只是在我的原始帖子中的let TransactionsData = [] 代码块之后直接粘贴了您直接引用的两个项目,这有意义吗?我确实将您发送的第一行更新为let Transaction = require("../../models/Transaction.js");,我认为它应该可以工作(但我也尝试过你的)。
    • 你在 require 中修改路径是对的,我最好的猜测是为什么它没有找到文件是你在某处弄错了相对错误
    • 嘿大卫-感谢您的回复。您建议如何最好地解决此问题?我使用与原始帖子中链接的代码库完全相同的文件夹结构
    • 我仍然在努力引用这个文件。我认为适当的参考实际上是let Transaction = require("../../../models/Transaction.js");,因为该文件位于三个文件夹中,但是这给了我一个错误,即它位于 src 目录之外。一种可能的替代方法是将您的代码添加到 plaid.js 文件中,而不是在父目录中。这是指向确切文件 github.com/rishipr/mern-plaid/blob/master/routes/api/plaid.js 的链接,我相信它最适合第 131 行(在事务 API 调用发送到 JSON 之后)
    • 我刚刚意识到这个问题。您应该在一些后端代码中运行我给您的代码,或者将 Transaction.js 文件移动到 src 文件夹中,因为 react 不喜欢从 src 文件夹之外导入模块
    猜你喜欢
    • 2020-11-14
    • 2019-01-18
    • 1970-01-01
    • 2021-04-22
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2012-12-20
    相关资源
    最近更新 更多