Почему mongo не заполняет встроенные структуры? [Дубликат]

Вы можете включить полную отчетность об ошибках (включая уведомления и строгие сообщения). Некоторые люди считают это слишком многословным, но это стоит попробовать. Установите error_reporting на E_ALL | E_STRICT в вашем php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT уведомит вас об устаревших функциях и даст вам рекомендации о лучших методах выполнения определенных задач.

Если вы не хотите получать уведомления, но вы найдете другие типы сообщений полезными, попробуйте исключить уведомления:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Также убедитесь, что display_errors включен в php.ini. Если ваша версия PHP старше 5.2.4, установите ее в On:

display_errors = "On"

Если ваша версия 5.2.4 или новее, используйте:

display_errors = "stderr"
9
задан samol 9 October 2013 в 19:16
поделиться

2 ответа

Вы должны взглянуть на встроенный флаг bson-пакета (который описан в bson.Marshal ). Это должно позволить вам сделать что-то вроде этого:

type adminUser struct {
    User `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

Однако теперь вы заметите, что при попытке прочитать из базы данных с этой структурой вы получаете повторяющиеся ключевые ошибки, поскольку оба adminUser и User содержат ключ secret.

В вашем случае я удалил бы поле Secret из User и имел бы только тот, что был в adminUser. Затем, когда вам нужно писать в поле secret, убедитесь, что вы используете adminUser.

24
ответ дан Kokizzu 21 August 2018 в 13:59
поделиться
  • 1
    В этом случае я получаю ошибку времени выполнения: внутренняя ошибка сервера. Дублированный ключ «секрет» в struct main.adminUser! – samol 9 October 2013 в 19:55
  • 2
    Обновлен мой ответ. Я не понимал, что есть дублированные ключи. – Evan Shaw 9 October 2013 в 20:37
  • 3
    Как примечание к записи, использование тега & quot; inline & quot; работает даже для обычных полей (не встроенных / не анонимных). – Gustavo Niemeyer 9 October 2013 в 22:42

Другой альтернативой было бы объявление интерфейса.

type SecureModel interface {
    SecureMe()
}

Убедитесь, что ваша модель реализует его:

type User struct {
    Id       bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
    Username string        `json:"username" bson:"username"`
    Secret   string        `json:"secret,omitempty" bson:"secret"`
}

func (u *User) SecureMe() {
    u.Secret = ""
}

И вызывается только в зависимости от того, какой маршрут вызывается.

// I am being sent to a non-admin, secure me.
if _, ok := user.(SecureModel); ok {
    user.(SecureModel).SecureMe()
}
// Marshall to JSON, etc.
...

Изменить: причина использования интерфейса здесь - это случаи, когда вы можете отправлять произвольные модели по проводу с использованием общего метода.

1
ответ дан bojo 21 August 2018 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: