簡體   English   中英

你如何更新Node.js中的一對多關系?

[英]How do you update one-to-many relationships in Node.js?

我正在使用的節點應用程序mongoosemongodb ,和restify 我想知道在定義路由功能時是否從各種模型導入代碼是一種好習慣。 這應該是一個相當簡單的問題,我只需要指導,我就能自己編寫代碼。 感謝您抽時間閱讀。

我知道如何定義這種關系,但我不確定如何建立這種關系。 也就是說,換句話說,當汽車被創建時,向汽車添加汽車的最佳方式是什么。

請注意,我正在努力保持這個api RESTful。

我有兩個模型,我必須根據以下模式進行鏈接,該模式存儲在db/schema.js

//schema.js
  var restify = require('restify');
  var mongoose = require('mongoose');
  var Schema = mongoose.Schema;
  var ObjectId = Schema.ObjectId;

// User Schema

  exports.User = new Schema({
    id: ObjectId,
    name: String,
    cars: [{ type: ObjectId, ref: 'Car' }],
  });

// Car Schema

  exports.Car = new Schema({
    id: ObjectId,
    name: String,
    _user: { type: ObjectId, ref: 'User' },
  });

然后我在models/...構建模型,其中每個模型都有不同的文件。 現在他們每個人只有一行代碼,但是當我需要編寫模型方法時,我將它們留作獨立文件。

models/car.js

  mongoose.model('Car', db_schema.Car);

models/user.js

  mongoose.model('User', db_schema.User);

最后,我使用post設置路由並在routes/cars.js請求

這不是全部,只是回答我的問題所必需的。

  module.exports = function(app) {

    function putCar(req, res, next) {
      Car.findById(req.params.id, function (err, car) {
        if (!err) {
          car.name = req.params.name;
          car.save(function (err) {
            if (!err) {
             // PLACE A
             // current_user = get current user from session
             // current_user.cars.push(car);
              res.send(car);
              return next();
            } else {
              return next(new restify.InternalError(err));
            }
          });
        } else {
          return next(new restify.MissingParameterError('ObjectId   required.'));
        }
      });
     }

    function postCar(req, res, next) {
      var car = new Car(req.params);
      car.save(function (err, car) {
        if (!err) {
          // PLACE B
          // current_user = get current user from session
          // current_user.cars.push(car);
          res.send(car);
        } else {
          return next(err);
        }
      });
    }

    app.post('api/car', postCar);
    app.put('/api/car', putCar);
  }

將代碼如偽代碼放在A位置和B位置是否合適? 我想到的問題是我需要在routes / cars.js文件中要求User模型,這樣可以減少模塊化。 在models / car.js中這樣做會更好嗎?

我不同意你需要一個架構的假設。 我相信人們95%的時間都在使用Mongoose他們真的不需要它,因為定義這樣的模式的好處不會超過人們用它做什么的缺點。 如果在應用程序中驗證數據對象與模式匹配時存在一些關鍵且不尋常的角色,那么可能會有所不同。 但是你必須在前端做到這一點我並不認為大多數系統真的需要在后端以不同的方式復制這種努力。

對於絕大多數情況,數據庫相對較小且簡單。 您的情況可能不是例外。 因此,讓我們實際利用我們擁有無模式數據庫並丟失樣板的事實。

您似乎計划為每個集合編寫大量的樣板代碼。 不要那樣做。 相反,請看一下Node的一些CRUD系統: https//github.com/AndrewRademacher/auto-crud MongoDB是否有原生REST接口? 和/或您可以根據您的特定需求添加它們。

我認為這個關於將業務添加到后端會話的用戶對象的業務的一般理念的一部分可能與安全性有關。 換句話說,假設你不能僅僅拿出前端的話來保存用戶對象以及它擁有的任何汽車,因為有人可能試圖破解前端。 同樣,對於絕大多數情況,我只是不認為這是一個明智的假設。

我認為如果你只有一些通用的方法在后端做CRUD並且只是將汽車添加到前端的用戶數據對象,那將會簡單得多。 如果你真的需要(例如,有一個有效的業務理由,比如影響底線的東西),你可以在通用CRUD系統的頂端做后端的細粒度安全性。

當幾乎所有的數據庫都是基於SQL的並且在后端有嚴格的靜態語言模式時,主要是東西是一種保留信念系統,所以你幾乎不得不使用一堆樣鍋代碼或者依賴於元編程很棘手使用靜態語言。

我認為在95%的情況下,現在我們有JSON和動態語言這樣的東西,有一堆樣板只是由實體和有時字段名稱區分是錯誤的。

我會提出兩點建議:

  1. 如果您希望它們增長得相對較大,則將路徑文件中的功能代碼抽象到每個其余功能的控制器。

  2. 或者,您可以在每個表周圍創建自己的DAO(數據庫訪問對象)包裝器,然后在更簡單的路由文件中進行調用時將它們視為JavaScript對象而不是表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM