Экспресс res.json
вызывает JSON.stringify()
, как указано в документах , что в свою очередь вызывает экземпляр (Sequelize) toJSON
.
С другой стороны, res.render
вызывает app.render
, что вызывает view.render
, что в итоге вызывает шаблонизатор. В течение всего этого процесса различные параметры объединяются, но, как мне удалось заметить, как в коде, так и в документации, toJSON
не вызывается для предоставленных вами данных. Объект просто передается в течение всего процесса шаблонизатору, и если шаблонизатор пытается получить доступ к свойству через instance['newColumn']
, он может прочитать undefined, поскольку реализация setDataValue
делает: instance.dataValues[key] = value
.
Экземпляры Sequelize сохраняют свои значения в объекте dataValues
и используют методы получения, чтобы получить значения при обращении к ним через точечную запись. Это может привести к некоторым ситуациям, когда получатель не отображается правильно или по какой-то причине не может получить форму свойства dataValues
. У меня лично была эта проблема, когда я распространял объекты на новые и передавал этот новый объект куда-то еще.
Один из обходных путей, который вы всегда можете использовать, - это сделать {data: instance.dataValues}
или использовать простой параметр, как вы обнаружили (который в основном делает то же самое в большинстве ситуаций, но более чист, поскольку dataValues
на самом деле не предназначен для доступа). непосредственно).
Второй обходной путь - это, конечно, вызов функции toJSON
самостоятельно и последующий синтаксический анализ результата в простой объект.
Оба эти подхода не только совершенно верны, но и имеют хороший дизайн, потому что вы не должны передавать «отслеживаемые» модели ORM в качестве моделей представления (что вы делаете во втором обходном пути). Это делает вашу базу данных слоями приложения, которые не должны иметь к ней доступа и могут вызвать непредвиденное поведение.
<ч />
TLDR: Обходной путь 1 - лучший подход