#mongoose #mongoose-schema
#mongoose #mongoose-schema
Вопрос:
Я без проблем использую mongoose encryption в другой коллекции того же приложения, но теперь, когда я хочу использовать его в новой коллекции, документы сохраняются в зашифрованном виде, но когда я пытаюсь их получить, я получаю следующую ошибку, и я не могу найти, в чем проблема.
Сообщение об ошибке:
Error: Authentication failed
at Object.schema.methods.authenticateSync (C:ProyectosLIMSpnode_modulesmongoose-encryptionlibpluginsmongoose-encryption.js:436:19)
at model.<anonymous> (C:ProyectosLIMSpnode_modulesmongoose-encryptionlibpluginsmongoose-encryption.js:239:47)
at Kareem.execPreSync (C:ProyectosLIMSpnode_moduleskareemindex.js:115:16)
at model.syncWrapper [as $__init] (C:ProyectosLIMSpnode_moduleskareemindex.js:232:12)
at model.Document.init (C:ProyectosLIMSpnode_modulesmongooselibdocument.js:486:8)
at completeMany (C:ProyectosLIMSpnode_modulesmongooselibhelpersquerycompleteMany.js:41:14)
at cb (C:ProyectosLIMSpnode_modulesmongooselibquery.js:1928:9)
at C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodbliboperationsexecute_operation.js:75:17
at executeCallback (C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodbliboperationsexecute_operation.js:68:9)
at handleCallback (C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodblibutils.js:129:55)
at C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodbliboperationsto_array.js:36:13
at handleCallback (C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodblibutils.js:129:55)
at completeClose (C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodblibcursor.js:859:16)
at Cursor.close (C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodblibcursor.js:878:12)
at C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodbliboperationsto_array.js:35:25
at handleCallback (C:ProyectosLIMSpnode_modulesmongoosenode_modulesmongodblibcorecursor.js:32:5)
Код схемы:
const mongoose = require("mongoose");
const encrypt = require("mongoose-encryption");
const analitoSchema = mongoose.Schema({
nombre: String,
abreviatura: String,
CAS: String,
sinonimos: [String],
grupoSustancias: [String],
estandarInterno: {value: Boolean, viewValue: String},
sectores: [String],
rubros: [String],
habilitado: {value: Boolean, viewValue: String},
excluido: {value: Boolean, viewValue: String},
observaciones: String
});
var encKey = "J/zNLhysm3yMP8v24 gsCZe7dccgq4pX5bxrM6X0vHM=";
var sigKey ="ZR35/JqMv0J1V7JU WMkV2U3HOjadPS6S6DExi2lv5v1N7S1T1I6Jm33ZSHMlnjz5qJeG0j3Qqm7ECvHMSr Mg==";
analitoSchema.plugin(encrypt, { encryptionKey: encKey, signingKey: sigKey });
module.exports = mongoose.model("Analito", analitoSchema);
Сохранение кода схемы:
exports.save= (req, res, next) => {
const analito = new Analito(req.body)
analito.save()
.then(documents => {
res.status(201).json({
message: newSavedMessage,
data: documents,
error: null
});
})
.catch(err => {
errorHandler.errorHandler(err, res);
})
};
Получить код всех документов:
exports.getAll= (req,res, next) => {
Analito.find()
.then((documents) => {
filteredDocuments = documents.filter((data) =>data.excluido.value != true);
res.status(200).json({
message: successfullMessage,
data: filteredDocuments,
error: null,
});
})
.catch((err) => errorHandler.errorHandler(err, res));
};
Ответ №1:
Я обнаружил, что проблема заключалась в функции сохранения.
Я передавал req.body в качестве аргумента при создании нового объекта схемы. New Analito(req.body)
.
Это работало нормально, если я не шифровал данные с помощью mongoose-encryption, но при шифровании данных это не сработало.
Решением было передать данные для каждого поля схемы.
const analito = new Analito({
nombre: req.body.nombre,
abreviatura: req.body.abreviatura,
CAS: req.body.CAS,
sinonimos: req.body.sinonimos,
grupoSustancias: req.body.grupoSustancias,
estandarInterno: {
value: req.body.estandarInterno.value,
viewValue: req.body.estandarInterno.viewValue
},
sectores: req.body.sectores,
rubros: req.body.rubros,
habilitado: {
value: req.body.habilitado.value,
viewValue: req.body.habilitado.viewValue
},
excluido: {
value: req.body.excluido.value,
viewValue: req.body.excluido.viewValue
},
observaciones: req.body.observaciones
})