【问题标题】:How to link a collection with user?如何将集合与用户链接?
【发布时间】:2018-07-30 08:23:35
【问题描述】:

我正在开发 MEAN 应用程序(Angular2+)。我想为每个用户维护一个单独的数据。截至目前,数据就像任何人都可以查看任何详细信息,但我想,如果我登录并输入详细信息,只有我可以查看这些详细信息。基本上我想将用户集合与其他集合链接。由于我是 Mongo 的新手,所以我对此一无所知。

user.ts

  import * as mongoose from 'mongoose'
  const userSchema = new mongoose.Schema({
  username: String,
  email: { type: String, unique: true, lowercase: true, trim: true },
  password: String,
  role: String
  });

cat.ts

import * as mongoose from 'mongoose';
const catSchema = new mongoose.Schema({
name : String,
height: String,
weight: String,
});

我不知道这是什么

base.ts

abstract class BaseCtrl {
abstract model: any;

// Get all
getAll = (req, res) => {
this.model.find({}, (err, docs) => {
  if (err) { return console.error(err); }
  res.json(docs);
});
 }

// Count all
count = (req, res) => {
this.model.count((err, count) => {
  if (err) { return console.error(err); }
  res.json(count);
});
 }

// Insert
insert = (req, res) => {
const obj = new this.model(req.body);
obj.save((err, item) => {
  // 11000 is the code for duplicate key error
  if (err && err.code === 11000) {
    res.sendStatus(400);
    }
  if (err) {
    return console.error(err);
   }
  res.status(200).json(item);
  });
  }
// Get by id
get = (req, res) => {
this.model.findOne({ _id: 'req.params.id '}, (err, obj) => {
  if (err) { return console.error(err); }
  res.json(obj);
  });
  }

// Update by id
update = (req, res) => {
this.model.findOneAndUpdate({ _id: req.params.id }, req.body, (err) => {
  if (err) { return console.error(err); }
  res.sendStatus(200);
});
}

 // Delete by id
 delete = (req, res) => {
this.model.findOneAndRemove({ _id: req.params.id }, (err) => {
  if (err) { return console.error(err); }
  res.sendStatus(200);
 });
 }
 }

export default BaseCtrl;

参考项目:https://github.com/DavideViolante/Angular-Full-Stack

【问题讨论】:

    标签: node.js angular mongodb mongoose


    【解决方案1】:

    您需要将 user_id 字段添加到 catSchema。 user_id 将作为添加/保存该猫的用户的参考。

    cat.ts

    import * as mongoose from 'mongoose';
    const catSchema = new mongoose.Schema({
       name : String,
       height: String,
       weight: String,
       user_id: String, // Or may be ObjectId
    });
    

    而且您每次都需要从 users 集合中查询用户来检索数据。

    或者你可以使用mongodb的DBRef。要在猫鼬中实现这一点,您可以关注this 链接。

    基本上你的猫模型是

    cat.ts

    import * as mongoose from 'mongoose';
    const catSchema = new mongoose.Schema({
       name : String,
       height: String,
       weight: String,
       user: { type: mongoose.Schema.ObjectId, ref: 'User' }
    });
    

    要插入猫,请从登录详细信息/会话中获取用户 ID 并添加到集合中。

    对您而言,您需要将“用户”字段添加到 req.body,就像在基本控制器中您从 req.body 创建模型一样。 如果不想添加到 req.body 中,可以重写 cat 控制器的 insert 方法,手动创建带有 userid 的 cat 模型。

    控制器/cat.ts

    import Cat from '../models/cat';
    import BaseCtrl from './base';
    
    export default class CatCtrl extends BaseCtrl {
       model = Cat;
    
       insert = (req, res) => {
         const data = {
            title: req.body.title,
            height: req.body.height,
            weight: req.body.weight,
            user: getUser() // Get the logged in userid
         };
         const obj = new this.model(data);
    
         obj.save((err, item) => {
    
         if (err && err.code === 11000) {
           res.sendStatus(400);
         }
         if (err) {
           return console.error(err);
         }
         res.status(200).json(item);
       })
     }
    }
    

    就像上面一样,您可以根据用户修改和过滤所有文档。

    编辑: 为简单起见,请在表单本身中发送当前登录的用户。猫.component.ts

    addCat() {
        this.addCatForm.value.userid = this.authService.currentUser._id; // You might need to use callback here
        ... // All other code
      }
    

    将猫控制器恢复到以前的状态。

    【讨论】:

    • 几乎完成了伙计.. 但我越来越喜欢“找不到名称 getUser()”
    • 您需要实现 getUser 函数,该函数将为您提供登录用户
    • 我在 user.service.ts 中有 getUser() 伙计。如何在控制器/cat.ts 中调用它。对不起,帮帮我
    • user.service.ts 中的 getUser() 是供客户端使用的,它是一个 API。但是您需要在服务器端实现另一个 getUser() ,如果使用的话,您将从会话或令牌中获得。或者您可以从客户端本身发送用户 ID。检查我所做的编辑。
    猜你喜欢
    • 2019-06-26
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多