如何设置关键外键是必需的

时间:2016-08-22 12:58:59

标签: loopbackjs

我有两个型号。公司和预订。
在模型公司的关系部分

"bookings": {
  "type": "hasMany",
  "model": "Booking",
  "foreignKey": "companyId"
}

问题是,可以在没有companyId的情况下发布预订,这是不正确的 来自探险家。

Booking {
  bookingId (string, optional),
  name (string),
  location (string),
  companyId (string, optional)
}

3 个答案:

答案 0 :(得分:3)

您实际上无法实施此特定验证。相反,你有几个不同的选择:

a)您可以通过端点POST /api/Company/{id}/Bookings强制执行通过公司创建预订,方法是禁用Booking.disableRemoteMethod('create', ...)以及能够从Booking模型创建记录的任何其他方法

b)您可以添加远程挂钩来检查公司记录是否存在并相应地抛出错误。

Booking.beforeRemote('create', function(ctx, booking, next) {
  var Company = Booking.app.models.Company;
  var companyId = ctx.req.body.companyId;

  if (companyId) {
    errorMsg = 'Company with id=' + companyId + ' does not exist.';
    var noCompany = new Error(errorMsg);
    Company.findById(companyId, function(err, company) {
      if (err) next(err);
      if (!company) {
        ctx.res.statusCode = 400;
        next(noCompany);
      } else {
        next();
      }
    });
  } else {
    next();
  }
});

您还必须对允许记录创建的任何其他端点执行相同的操作,例如PUT /api/Bookings

希望有所帮助!

答案 1 :(得分:0)

您可以在booking.json文件中显式添加companyId属性,并添加required:true属性。它看起来像

{
    "properties": {
        "companyId": {
            "type": "number",
            "required": true
        },
        ... //other properties
    }
}

答案 2 :(得分:0)

在richardpringle answer part b booking对我来说是个空物。

我能够通过将app添加到booking.js文件中来获得此答案,如下所示:

'use strict';
var app = require('../../server/server');

module.exports = function(Booking) {
  Booking.beforeRemote('create', function(ctx, booking, next) {
    var Company = app.models.Company;
    var companyId = ctx.req.body.companyId;

    if (companyId) {
      errorMsg = 'Company with id=' + companyId + ' does not exist.';
      var noCompany = new Error(errorMsg);
      Company.findById(companyId, function(err, company) {
        if (err) next(err);
        if (!company) {
          ctx.res.statusCode = 400;
          next(noCompany);
        } else {
          next();
        }
      });
    } else {
      next();
    }
  });
};
  • 第2行是新的
  • 第6行是根据richardpringle的回答修改的
    • 来自:var Company = Booking.app.models.Company;
    • 收件人:var Company = app.models.Company;