Programmation asynchrone dans le noeud js pour transmettre des constantes / valeurs obligatoires prédéfinies via le modèle mongoose

J’ai plusieurs questions, veuillez parcourir mon code.

1) comment passer des constantes / valeurs obligatoires prédéfinies dans le modèle?

Pour par exemple. J’ai quelques champs dont l’utilisateur doit transmettre les valeurs et certaines constantes à transmettre à l’intérieur du fichier kafkaSchema.config [] et également de livySchema.args []. Le code que je souhaite transmettre est en deuxième question sur le même fil de questions.

const mongoose = require('mongoose'); const livy_schema = mongoose.Schema({ file: { type: Ssortingng, required: true }, name: { type: Ssortingng, required: true }, className: { type: Ssortingng, required: true }, args: [{ type: mongoose.Schema.Types.Mixed, required: true }] //here i have constants to pass on to }); const kafka_schema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, name: { type: Ssortingng, required: true, unique: false }, config: { type: mongoose.Schema.Types.Mixed, required: true } //here i have constants to pass on to }); const enrichedEventSchema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, projectId: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true }, name: { type: Ssortingng, required: true, unique: true }, description: { type: Ssortingng, required: false }, type: { type: Ssortingng, enum: ["Enriched"], required: true }, format: { type: Ssortingng, enum: ["JSON", "DELIMITED", "FixedWidth", "LOG"], required: true }, kafka: [kafka_schema], livy: [livy_schema] // how to make this schema required:true? }); module.exports = mongoose.model('EnrichedEvent', enrichedEventSchema); 

2) comment faire en sorte que ce code soit exécuté de manière asynchrone, il fonctionne maintenant de manière synchrone. Par exemple, il peut enregistrer les données de l’événement dans la collection d’événements dans la firebase database, puis mettre à jour la collection de projets, puis appeler la méthode axios.post pour appeler mon serveur livy et le serveur kafka dans l’ordre. Ce que je veux faire, c’est enregistrer les données d’événement dans la collection d’événements dans la firebase database, puis mettre à jour la collection de projets (de manière synchrone), en attendant, je souhaite appeler mon serveur livy et kafka simultanément (de manière asynchrone).

 router.post("/:projectId/events/enriched", (req, res, next) => { const enrichedEvent = new EnrichedEvent({ _id: mongoose.Types.ObjectId(), name: req.body.name, projectId: req.params.projectId, //taking from url description: req.body.description, type: req.body.type, format: req.body.format, kafka: req.body.kafka, livy: req.body.livy }); enrichedEvent.save() .then(result => { console.log(result); res.status(201).json({ message: "Event stored", createdEvent: { _id: result._id, projectId: result.projectId, name: result.name, description: result.description, type: result.type, kafka: result.kafka, livy: result.livy } }); Project.findOneAndUpdate({ _id: result.projectId }, { $push: { enrichedEvents: result._id } }) axios.post("http://52.xxx.xxx.199:8998/batches", result.livy) .then(function (response) { console.log(response); }) .then(axios.get("http://52.xxx.xxx.199:8998/batches/"), function (res) { console.log(res); }) axios.post("http://52.xxx.xxx.199:8083/connectors", result.kafka) .then(function (response) { console.log(response); }) .catch(err => { console.log(err); res.status(500).json({ error: err }); }); }); }); 

La question peut sembler un peu longue, mais une question valable à poser sur SO. S’il vous plaît, guidez-moi dans la bonne direction.

1)

 const enrichedEventSchema = mongoose.Schema({ // ... livy: { type: [livy_schema], required: true } }); 

2)

 return enrichedEvent.save(). then(result => { // ... return Project.findOneAndUpdate(/*...*/); }). then(() => { // ... return Promise.all([axios.post(/*...*/), axios.post(/*...*/]); }); 

Hey essayez ce qui suit:

1) pour sauvegarder les configurations entrées par l’utilisateur et aussi pour avoir les constantes par défaut. Vous pouvez utiliser le mongoose pre save hook.

https://mongoosejs.com/docs/middleware.html#pre

 livy_schema.pre('save', function(next) { this.args = { ...this.args, ...CONSTANTS }; //I'm use es6's spread operator next(); }); kafka_schema.pre('save', function(next) { this.config = { ...this.config, ...CONSTANTS }; //I'm use es6's spread operator next(); }); 

2) Pour la deuxième question: essayez de suivre:

 axios.all([ axios.post("http://52.221.178.199:8998/batches", result.livy), axios.post("http://52.221.178.199:8083/connectors", result.kafka) ]);