Sails.js - Как обновить модель с помощью ассоциаций

Я пытаюсь работать с Модели с ассоциациями. У меня две модели:

user.js

module.exports = {schema: true, attributes: {
 userId: {
 autoIncrement: true,
 type: integer,
 primaryKey: true,
 },
 userId: {type: integer},
 email: {type:string, size:200},
 addressId: {
 model:UserAddress
 }
}

Address.js

module.exports = {schema: true, attributes: {
 addressId: {
 autoIncrement: true,
 type:integer,
 primaryKey:true
 },
 userId: {type:integer},
 address: {type:string, size:250}
}

До сих пор я смог создавать записи в обеих моделях посредством POSTing после JSON, чтобы

http://localhost:1337/user/

{
 "userName": "John",
 "userId": "3",
 "email":"[removed_email]",
 "addressId": {
 "userId": "3",
 "address": "123 abc street"
 }
 }

Я смог ОБНОВИТЬ обе записи, используя PUT, с этим URL-адресом: http://localhost:1337/user/update/1 и JSON ниже, обратите внимание, что я добавил addId во вложенном JSON в этом случае.

{
 "userName": "John",
 "userId": "3",
 "accountLogin":"[removed_email]",
 "addressId": {
 "addressId":1,
 "userId": "3",
 "streetAddress": "123 abc street"
 }
}

Однако, когда я впервые создал запись в таблице User без адреса и позже захотел ее добавить, мне не повезло, чтобы она работала. То, что я сделал, это использовать PUT против http://localhost:1337/user/update/1 со следующим JSON, так как адрес новый, там нет addressId.

{
 "userName": "John Doe",
 "accountLogin":"[removed_email]",
 "addressId": {
 "userId": "3",
 "streetAddress": "123 abc street"
 }
}

Есть ли способ сделать то, что я пытался сделать в Sails.js? Я мог бы просто http://localhost:1337/address чтобы создать новую запись, но я хочу сделать свой API совместимым. Более серьезная проблема заключается в том, что когда выше JSON был отправлен, он разбил сервер. Мне кажется, что пользователь может легко скомпрометировать бэкэнд, отправив недействительный JSON, как бы защитить бэкэнд от такого рода сбоев?

1 ответ

Hy,

Чтобы добавить новый объект в коллекцию внутри объекта, вы можете использовать встроенный в пару (встроенный) метод "добавить". Я проверил документацию на парусах на веб-сайте, но не был успешным, однако, если вы проверите add проект в репозитории github, он сделает именно то, что вы ищете.

Вот что говорит описание метода:

/**
 * Add Record To Collection
 *
 * post /:modelIdentity/:id/:collectionAttr/:childid
 * * /:modelIdentity/:id/:collectionAttr/add/:childid
 *
 * Associate one record with the collection attribute of another.
 * e.g. add a Horse named "Jimmy" to a Farm "animals".
 * If the record being added has a primary key value already, it will
 * just be linked. If it doesn't, a new record will be created, then
 * linked appropriately. In either case, the association is bidirectional.
 *
 * @param {Integer|String} parentid - the unique id of the parent record
 * @param {Integer|String} id [optional]
 * - the unique id of the child record to add
 * Alternatively, an object WITHOUT a primary key may be POSTed
 * to this endpoint to create a new child record, then associate
 * it with the parent.
 *
 * @option {String} model - the identity of the model
 * @option {String} alias - the name of the association attribute (aka "alias")
 */

И ответить на ваш следующий вопрос да есть также метод remove;)

Вы можете найти дополнительную информацию: https://github.com/balderdashy/sails/tree/master/lib/hooks/**********/actions

licensed under cc by-sa 3.0 with attribution.