Когда атрибуты модели парусов по умолчанию получают свои значения?

Когда паруса заполняют глобальные атрибуты по умолчанию, которые мы добавили в config/models.js, настройки по умолчанию выглядят так:

attributes: {
  id: { type: 'number', autoIncrement: true },
  createdAt: { type: 'number', autoCreatedAt: true },
  updatedAt: { type: 'number', autoUpdatedAt: true },
}

Теперь, если мы добавим что-то вроде creatorId к этим атрибутам по умолчанию, как мы должны заполнить его один раз для всех наших models?

attributes: {
  id: { type: 'number', autoIncrement: true },
  createdAt: { type: 'number', autoCreatedAt: true },
  updatedAt: { type: 'number', autoUpdatedAt: true },
  creatorId: { type: 'number'}
}

После этого изменения все модели имеют creatorId со значением 0, как я могу установить userId для всех моих моделей creatorId перед сохранением, не повторяя себя?

Что вы хотите установить? Значение по умолчанию или вы хотите передать его?

Canis 22.01.2019 17:11

@Canis Я хочу установить для него текущий идентификатор пользователя logged-in, который доступен на req.user.id

SayJeyHi 23.01.2019 06:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
301
1

Ответы 1

В контроллере вы создаете запись в базе данных, это должно быть довольно просто. Предположим, у вас есть две модели: User со встроенной аутентификацией Sails и Thing, которым может владеть кто-то другой.

В модели Thing я бы изменил ownerId на owner и связал его с моделью User следующим образом:

attributes: {
    id: { ... },
    createdAt: { ... },
    updatedAt: { ... },
    owner: {
        model: 'User',
        required: yes      // Enable this when all the stuff in the db has this set
    },
}

Это создает ассоциацию или отношение «один ко многим», если вы знаете терминологию базы данных.

Теперь в контроллере, где вы создаете свой объект для вставки:

Thing.create({
  someAttribute: inputs.someValue,
  someOtherAttribute: inputs.someOtherValue,
  owner: this.req.me.id
});

Если вы хотите сразу использовать созданный объект, добавьте .fetch() в цепочку после .create({...}) следующим образом:

var thing = await Thing.create({ ... }).fetch();

Дайте мне знать, если что-то неясно.

Я действительно рекомендую вам инвестировать 9 долларов в покупку курса SailsJS. Это официальный курс, который ведет создатель SailsJS Майк Макнил. Это приведет вас от npm i sails -g к запуску в производство на облачной платформе Heroku. Он учит основам Vue (разновидность парашюта), использованию MailGun, платежей Stripe и многому другому. Они ссылаются на курс на сайте здесь

Обновлять

Покопался еще немного и вдохновился парой подобных случаев.

Что вы можете сделать, так это расширить свою модель с помощью пользовательского метода, который обертывает метод .create(). Этот метод может получать объект запроса от ваших контроллеров, но выполнение этого, а не предыдущего предложения, вероятно, потребует больше работы, чем просто добавление ownerId: this.req.me.id, к существующим вызовам. Я все равно продемонстрирую.

// Your model
module.exports = {
    attributes: { ... },
    proxyCreate(req, callback) {
        if (!req.body.ownerId){
            req.body.ownerId = req.me.id     // or req.user.id, cant remember 
                                             // which works here
        }
        Thing.create(request.body, callback);
    }
}

И в вашем контроллере:

...
// Change from:
Thing.create(req.body);

// To:
Thing.proxyCreate(req);
...

Обновление №2

Еще одна идея, которая у меня была, заключалась в добавлении промежуточного программного обеспечения для каждого маршрута. Я не знаю сложности ваших маршрутов, но вы можете создать собственное промежуточное ПО только для этих маршрутов.

В router.js вы редактируете свои маршруты (для краткости я покажу один):

....
'POST /api/v1/things/upload-thing': [
        { action: 'helpers/add-userid-to-ownerid' },
        { action: 'new-thing' }
],
....

В helpers/add-userid-to-ownerid:

module.exports: {
    fn: function(req, res) {
        if (!req.body.ownerId){
            req.body.ownerId = req.me.id;
        }
    }
}

спасибо Canis, но таким образом я должен заполнить этот атрибут owner для каждого .create моих моделей, например: Thing1, Thing2, Thing3. Есть ли другой способ, например промежуточное ПО, для установки атрибута перед каждым вызовом .create?

SayJeyHi 23.01.2019 08:10

@Jafarrezaei Должен признаться, я в замешательстве. Вы создаете модели без ввода данных? Использование только значений по умолчанию? Я также не уверен, почему установка атрибута в вызове .create() является проблемой, поскольку именно здесь вы устанавливаете все остальные данные.

Canis 23.01.2019 08:20

да, вы правы, .create() — это место, где мы устанавливаем все данные, но мне нужно установить автоматически сгенерированное значение (ownerId) для всех моделей без необходимости упоминать их в методе создания, например, как работают createdAt и updatedAt.

SayJeyHi 23.01.2019 08:27

@Jafarrezaei Вы сказали, что идентификатор владельца должен быть идентификатором текущего пользователя, вошедшего в систему. Этот идентификатор req.me.id. Теперь вы хотите, чтобы это было случайно сгенерированное значение, автоматически созданное базой данных. Я снова в замешательстве. Не могли бы вы объяснить ваш конкретный вариант использования более подробно?

Canis 23.01.2019 09:20

да, мне нужен идентификатор пользователя в этом атрибуте, я думал, что временная метка createdAt обрабатывается sails, а не базой данных, и я искал, где паруса устанавливают эту временную метку, и подумал о том, чтобы сделать некоторый код для прикрепления идентификатора пользователя вместо timestamp к другому атрибуту глобально нравится как работает createdAt

SayJeyHi 23.01.2019 09:33

@Jafarrezaei Ну, ORM, Waterline, может быть задействован в создании данных, но я не уверен. Также могут быть способы использования промежуточного программного обеспечения, как вы говорите, но я чувствую, что это становится слишком громоздким и не стоит того, когда у вас уже есть данные настройки операторов .create(). Добавление к ним ..., owner: req.me.id,... — это лучший дизайн и гораздо более удобный в обслуживании в будущем. Вы устанавливаете все свои данные не по умолчанию в одном месте. Извините, если это не тот ответ, который вы хотите.

Canis 23.01.2019 09:39

@Jafarrezaei Я немного больше изучил для вас функциональность, подобную промежуточному программному обеспечению, и самое близкое, что я получаю, - это использование жизненного цикла модели, где у вас есть beforeCreate и аналогичные функции. Проблема в том, что это на сервере, и в этот момент у вас нет доступа к объекту пользователя и, следовательно, не к идентификатору.

Canis 23.01.2019 11:06

спасибо, дорогой Канис, да, это может быть хорошим подходом, если бы мы могли получить доступ к идентификатору пользователя в 'model.js`

SayJeyHi 23.01.2019 11:23

@Jafarrezaei У меня есть два обновления для вас с дополнительными предложениями. Один из них - настоящая промежуточная посуда. Обратите внимание, что мне не удалось запустить код, поэтому остерегайтесь ошибок и синтаксических ошибок.

Canis 23.01.2019 21:17

Другие вопросы по теме