Поиск пользователя и добавление идентификатора в его свойство массива друзей - PullRequest
0 голосов
/ 11 июля 2020

При нажатии кнопки «Следить за пользователем» (в компоненте Frienddetail) вызывается функция addPeopleFollow. С помощью этой функции я хочу сохранить идентификатор пользователя, которого щелкнули (того, за которым вы пытаетесь следовать) в свойстве Friends Array пользователя, который вошел в мою базу данных / щелкнул мышью.

В моей базе данных есть Коллекция пользователей со всеми пользователями для каждого пользователя это:

_id:5eff397b70d78284c8c45186
friends:Array
username:"charlestryingout"
password:"$2b$10$CYMyPx10gk0jO5XoazcrSO32Ng37qoyU6uXkkeaswQ5KWm7k7ooym"
__v:0

Например: если пользователь с id = 5eff397b70d78284c8c45186 нажимает на другого пользователя с id = 5eff397b70d78284c8c45187, то я хотел бы получить это в результате в моей базе данных:

_id:5eff397b70d78284c8c45186
friends:Array[5eff397b70d78284c8c45187]
username:"charlestryingout"
password:"$2b$10$CYMyPx10gk0jO5XoazcrSO32Ng37qoyU6uXkkeaswQ5KWm7k7ooym"
__v:0

Я закодировал содержимое функции addPeopleFollow (ax ios request) и мне удалось заставить ее работать (я вижу console.logs в. затем в моей консоли ). Не стесняйтесь предлагать изменения, если считаете, что они неполные.

Мой вопрос:

Может ли кто-нибудь помочь мне в написании бэкэнда (первая версия ниже)? Сначала мне нужно будет найти в моем списке пользователей пользователя, который в настоящее время вошел в систему (с помощью функции getUser это должно работать). Когда этот конкретный пользователь c будет найден, мне придется добавить идентификатор в его свойство массива друзей. Моей первой идеей было бы .findByIdAndUpdate ({_ id: iduser}), но тогда я не знаю, как вставить sh идентификатор в существующий массив друзей (часть обновления).

Не могли бы вы написать полный код (подумайте только о бэкэнде, но не стесняйтесь предлагать изменения и во внешнем интерфейсе. Я использую Node / Mongoose / MongoDB / React

Front-end React

addPeopleFollow(idpeopleyoufollow){
    Axios({
        method: "POST",
        url: `${process.env.REACT_APP_API_BASE}/friends`,
        data: qs.stringify(idpeopleyoufollow),
        headers: {"content-type": "application/x-www-form-urlencoded"},
        withCredentials: true
    })
    .then(() => {
        console.log("charles")
        console.log(idpeopleyoufollow)
        console.log("charles")
    })
    .catch((error) => {
        console.log(error.response)
    })
}
    
render() {
    return (
        <DefaultLayout>
        <div className="friendsoverviewcontainer">
            <h1>Our community ({this.state.friends.length} registered users)</h1>
            <form className="friends">               
                <div className="titlepart">
                    <label className="friendlabel" htmlFor="friend">Search for Users :</label><br></br>
                    <input className="friendform" type="text" name="friend" value={this.state.friend} placeholder="Type a username here!" onChange={this.searchFriends}></input>
                </div>
            </form>

            <div className="friendsboxes" >
                {
                    this.state.searchFriends.map(friend =>
                        <div key={friend._id}>
                            <Frienddetail 
                                key={friend._id}
                                id={friend._id}
                                username={friend.username}
                                location={friend.location}
                                innerCircle={this.addToInnerCircle}
                                peopleFollow={this.addPeopleFollow}
                            />
                        </div>
                    )   
                }
            </div>
        </div>

Спецификация c Компонент Frienddetail

import React from 'react'
import './Frienddetail.css'

class Frienddetail extends React.Component {
    constructor() {
        super()

        this.state = {
            
        }
    }

    render() {
        return (
                <div className="friendbox">
                    <img className="imagedaredevilspicdetail" src="/images/profileimage.png" alt="picturesetting" />
                    <p className="friend">{this.props.username}</p>
                    <p className="friend">{this.props.location}</p>
                    <button className="followbutton" onClick={(e) => this.props.peopleFollow(this.props.id)}>Follow user!</button>
                    <button className="friendbutton" onClick={(e)=> this.props.innerCircle(this.props.id)}>Add to inner circle!</button>
                </div>
        )
    }
}

export default Frienddetail

модель пользователя

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

const userSchema = new Schema({
    username: String,
    password: String,
    location: String,
    imageUrl: String,
    friends: [String],
    error: String
})

const User = mongoose.model("users",userSchema)

module.exports = User;

Бэкэнд

// add peopleYouFollow
router.post("/friends", (req,res) => {
  console.log("thisishappening")
  let iduser = getUser()._id 
  User
  .findByIdAndUpdate({_id:iduser})
  .then((response) => {
    res.json(response)
    console.log("thisishappening")
  })
  .catch(error => {
    res.json(error)
  })
})

1 Ответ

0 голосов
/ 11 июля 2020

Прежде всего, я хотел бы предложить некоторые изменения в Schema, поскольку вы сохраняете Array of String, вы должны хранить Array of ObjectId, потому что вы храните objectId _id, вы можете изменить свою схему следующим образом

const mongoose = require("mongoose")

const userSchema = new Schema({
    username: String,
    password: String,
    location: String,
    imageUrl: String,
    friends: [mongoose.Schema.Types.ObjectId],
    error: String
})

Возможно, вам придется сбросить свою коллекцию и построить ее заново.

Я не уверен, получаете ли вы оба идентификатора, в противном случае вам может потребоваться обновить свой запрос ax ios отправить все данные. Предполагая, что вы получаете оба ID's и не можете ничего добавить в массив friends?

Это потому, что вы ничего не добавляете в свой массив, для этого вам нужно использовать $ pu sh оператор вроде этого -

 router.post("/friends", (req,res) => {
  let iduser = getUser()._id 
  User.update({_id:iduser},{$push:{friends: ID of Friend here!}})
  .then((response) => {
    res.json(response)
  })
  .catch(error => {
    res.json(error)
  })
})

Я не использовал go весь ваш код, потому что вы опубликовали слишком много, но это суть того, что вы ищете !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...