Используйте бессерверную функцию для поиска byId в базе данных MongoDB через Mongoose и отображения результата в форме React — не работает

#reactjs #mongodb

#reactjs #mongodb

Вопрос:

Я создал страницу редактирования, которая пытается извлечь отдельный объект из моей базы данных MongoDB, используя ‘findById’ в бессерверной функции, размещенной на Vercel.

Данные ответа, которые я затем пытаюсь использовать для заполнения «значения» различных входных данных на этой странице «редактирования».

Однако я не получаю ответа от своего вызова (даже сообщения об ошибке, ни в моей консоли, ни в журналах функций на Vercel) — страница загружается успешно, но данные не вводятся во входные данные, они проходят как пустые. Я добавил журнал консоли для ответа, и подробности об этом приведены в редактировании ниже.

Стоит отметить, что URL — это идентификатор MongoDB для вызываемого объекта!

Я пробовал рефакторинг своего кода, поиск решений, просмотр руководств, но, похоже, ничего не работает. Это расстраивает, поскольку я просто не получаю никаких отзывов от своего приложения, поэтому не знаю, что я делаю не так?

Если у кого-нибудь есть какие-либо отзывы о моем коде, это было бы оценено. Пожалуйста, дайте мне знать, если я что-то пропустил ниже.

«Дочерний» и «родительский» компоненты — это просто способ перехода на страницу.

Мой «маршрут» через маршрутизатор React:

 <Route path="/edit/:id" component={EditDebt} />
  

Моя схема MongoDB:

 const SubmitDebtSchema = new Schema ({
  creditCard: String,
  personalLoan: String,
  provider: String,
  balance: Number,
  limit: Number,
  monthly: Number,
  interest: Number,
  borrowed: Number
});

module.exports = mongoose.model('submitdebts', SubmitDebtSchema);
  

Мой «дочерний» компонент, который использует реквизиты для заполнения ссылки с использованием идентификатора MongoDB ответа.

 <div className="debt-card-edit-container"><a className="debt-card-edit-link" href={`/edit/${props.edit}`}>Edit</a></div>
  

Мой «родительский» компонент, который заполняет реквизит при использовании вызова базы данных:

 <IndividualDebtCard edit={debt._id} />
  

Моя бессерверная функция «выборки»:

 const mongoose = require("mongoose");
const SubmitDebt = require("./submitDebtSchema");

require("dotenv").config();

mongoose.connect(process.env.MONGO_URI);
    
  module.exports = async (req, res) => {
      let id = req.params.id;
      await SubmitDebt.findById(id, function(err, submitdebts) {
        if (err) {
          console.log(err);
        }
        console.log(req.params.id)
        console.log(submitdebts);
        return res.status(200).json(submitdebts);
      });
  };
  

Наконец, и это самое главное, мой фактический компонент «редактировать» полностью…

     class EditDebt extends Component {
      constructor(props) {
        super(props)
    
        this.state = {
          provider: '',
          balance: '',
          limit: '',
          monthly: '',
          interest: '',
          borrowed: ''
        }
    
        this.onChange = this.onChange.bind(this);
      }
    
       componentDidMount() {
        axios.get("/api/fetchEditDebt")
          .then(response => {
            this.setState({
              provider: response.data.provider,
              balance: response.data.balance,
              limit: response.data.limit,
              monthly: response.data.monthly,
              interest: response.data.interest,
              borrowed: response.data.borrowed
            })
            console.log(res)
            console.log(this.state.provider)
          })
          .catch(function (error) {
            console.log(error)
          })
      }
    
      onChange = (e) => {
            this.setState({ [e.target.name]: e.target.value})
        }
    
      render() {
    
        return (
          <section className="edit-debt-section">
            <div className="edit-debt-container">

    
<input type="text" value={this.state.provider} onChange=.  {this.onChange} />


            </div>
          </section>
        )
      }
    }
  

Извините за весь код, и, пожалуйста, дайте мне знать, если я пропустил что-то действительно важное в моем вопросе.

Спасибо

РЕДАКТИРОВАТЬ: я удалил ‘this.props.match.params.id «и попытался повторно запустить мой код.. Теперь я получаю следующую ошибку в своем серверном:

 2020-10-23T14:55:25.984Z    71f7b650-1a7d-42c2-953e-ff17edc22cb5    ERROR   Unhandled Promise Rejection     {"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"TypeError: Cannot read property 'id' of undefined","reason":{"errorType":"TypeError","errorMessage":"Cannot read property 'id' of undefined","stack":["TypeError: Cannot read property 'id' of undefined","    at module.exports (/var/task/api/fetchEditDebt.js:12:23)","    at Server.<anonymous> (/var/task/___now_helpers.js:813:19)","    at Server.emit (events.js:315:20)","    at parserOnIncoming (_http_server.js:790:12)","    at HTTPParser.parserOnHeadersComplete (_http_common.js:119:17)"]},"promise":{},"stack":["Runtime.UnhandledPromiseRejection: TypeError: Cannot read property 'id' of undefined","    at process.<anonymous> (/var/runtime/index.js:35:15)","    at process.emit (events.js:327:22)","    at processPromiseRejections (internal/process/promises.js:209:33)","    at processTicksAndRejections (internal/process/task_queues.js:98:32)"]}
Unknown application error occurred
  

Ответ №1:

Замените свой код api axios этим.

 axios.get("/api/fetchEditDebt", { params: { id: this.props.match.params.id }})
      .then(response => {
        this.setState({
          provider: response.data.provider,
          balance: response.data.balance,
          limit: response.data.limit,
          monthly: response.data.monthly,
          interest: response.data.interest,
          borrowed: response.data.borrowed
        })
        console.log(res)
        console.log(this.state.provider)
      })
      .catch(function (error) {
        console.log(error)
      })
  

Комментарии:

1. Привет, спасибо за это. Я решил это некоторое время назад, но это в основном решение, которое я использовал. Спасибо за помощь.

Ответ №2:

Может быть, добавьте дополнительный ‘/’ в URL вашего запроса?

axios.get("/api/fetchEditDebt/" this.props.match.params.id)

Комментарии:

1. Пробовал, не повезло. Я обновляю свой первоначальный вопрос выводами из нескольких журналов консоли.

2. Можете ли вы гарантировать, что сможете подключиться к MongoDB? Также вы можете записать, какой ответ. приведенный выше код, который я вижу, является объектом loggin res вместо ответа.

3. Привет — я могу подключиться, используя эту точную настройку в других функциях моего приложения для MongoDB, так что никаких проблем! Можете ли вы уточнить, какой именно журнал консоли тоже? Я пробовал это с console.log(response) и console.log (res), каждый раз с одним и тем же выводом. Приветствия.

4. Не могли бы вы расширить объект данных в ответе. Я не уверен, что это тот, который вы должны получать, эта проблема может быть на стороне сервера.

5. Объект данных не расширяется! Что странно. Я полагаю, что это происходит при других вызовах базы данных, которые я делаю в другом месте, поэтому я думаю, что вы правы — проблема заключается в бессерверной функции (я думаю).