2017-03-17 1 views
0

Je voudrais procéder comme suit:noeuds demande API

  1. créer un nouvel objet « évaluation »

  2. Obtenir des données de AClient et enregistrez l'objet

  3. Faire une demande de poste avec les données de l'objet "Evaluation"

  4. Ajouter une réponse à l'objet "Evaluation"

  5. Enregistrer pour mongo Db

Alls semble bon, mais je ne peux pas ajouter les données de réponse de la demande de poste à l'objet « d'évaluation ». Je peux y accéder. Mais je ne peux pas ajouter des données supplémentaires à partir de la deuxième demande.

res.on("end", function() { 
    //console.log(body.toString()); 
    body = JSON.parse(Buffer.concat(chunks)); 

console.log(body.value) // does work 

    evaluation.result.date = body.date; // does not work 
    evaluation.result.value = body.value; // does not work 

console.log(evaluation.street); //does work 


    }); 

Tout le code:

const express = require('express'); 
const router = express.Router(); 
const passport = require('passport'); 
const jwt = require('jsonwebtoken'); 
const config = require('../config/database'); 
const User = require('../models/user'); 
const Evaluation = require('../models/evaluation'); 
//Load the request module 
var request = require('request'); 

var evaluation = new Evaluation(); 
var body; 



router.post('/evaluation', (req, res, next) => { 
    evaluation.street =req.body.street; 
    evaluation.house_number =req.body.house_number; 
    evaluation.town =req.body.town; 
    evaluation.zip =req.body.zip; 
    evaluation.category =req.body.category; 
    evaluation.type =req.body.type; 
    evaluation.year =req.body.year; 
    evaluation.living_area =req.body.living_area; 
    evaluation.ground_area =req.body.ground_area; 
    evaluation.elevator =req.body.elevator; 
    evaluation.garages =req.body.garages; 



var http = require("https"); 
var options = { 
    "method": "POST", 
    "hostname": "", 
    "port": null, 
    "path": "", 
    "headers": { 
    "content-type": "application/json", 
    "authorization": "", 
    "cache-control": "no-cache", 
    "postman-token": "1d886874-2932-d64c-1f23-a62d657f75a2" 
    } 
}; 

var req = http.request(options, function (res) { 
    var chunks = []; 

    res.on("data", function (chunk) { 
    chunks.push(chunk); 
    }); 

    res.on("end", function() { 
    //console.log(body.toString()); 
    body = JSON.parse(Buffer.concat(chunks)); 

console.log(body.value) // does work 

    evaluation.result.date = body.date; // does not work 
    evaluation.result.value = body.value; // does not work 

console.log(evaluation.street); //does work 


    }); 
}); 


if (evaluation.type == "ETW") { 

    req.write(JSON.stringify({ 
    category: 'ETW', 
    date: '2017-03-02', 
    address: 
    { nation: 'DE', 
     street: evaluation.street, 
     house_number: evaluation.house_number, 
     zip: evaluation.zip, 
     town: evaluation.town }, 
    construction_year: evaluation.year, 
    living_area: evaluation.living_area, 
    elevator: evaluation.elevator, 
    garages: evaluation.garages })); 

} 

else { 

    req.write(JSON.stringify({ category: 'EFH', 
    date: '2017-02-17T00:00:00', 
    address: 
    { nation: 'DE', 
    street: evaluation.street, 
    house_number: evaluation.house_number, 
    zip: evaluation.zip, 
    town: evaluation.town }, 
    construction: evaluation.category, 
    construction_year: evaluation.year, 
    living_area: evaluation.living_area, 
    plot_area: evaluation.ground_area, 
    garages: evaluation.garages })); 




} 



req.end(); 



evaluation.save(function (err) { 
    if (err) return handleError(err); 
    // saved! 
}) 
res.json({"message": "Success"}); 
}); 



router.get('/evaluation', (req, res) => { 
    Evaluation.getAll((err, evaluations) => { 
     if(err){ 
      throw err; 
     } 
     res.json(evaluations); 
    }); 
}); 








module.exports = router; 

Schéma:

const mongoose = require('mongoose'); 
const config = require('../config/database'); 

// User Schema 
const EvaluationSchema = mongoose.Schema({ 
    street: { 
    type: String, 
    required: true 
    }, 
    house_number: { 
    type: String, 
    required: true 
    , 
    }, 
    town: { 
    type: String, 
    required: true 
    }, 
    zip: { 
    type: String, 
    required: true 
    }, 

    living_area: { 
    type: String, 
    required: true 
    }, 

    year: { 
    type: String, 
    required: true 
    }, 

    category: { 
    type: String, 

    }, 

elevator: { 
    type: String, 

    }, 

garages: { 
     type: String, 
     required: true 
    }, 

    ground_area: { 
     type: String 

     }, 


     result: { 
     date: {type: String}, 
     value: {type: String}, 
     meta: { 
      standarderror: {type: String}, 
      score: {type: String}, 
      range: { 
      min: {type: String}, 
      max: {type: String} 
      } 
     }, 
     coordinates: { 
      lat: {type: String}, 
      lng: {type: String}, 
     } 

    } 



}); 

const Evaluation = module.exports = mongoose.model('Evaluation', EvaluationSchema); 


// Get Books 
module.exports.getAll = (callback, limit) => { 
    Evaluation.find(callback).limit(limit); 
} 
+0

Personne n'a encore une idée? –

Répondre

0

Le problème est que vous ne fait qu'ajouter des données supplémentaires dans le gestionnaire end associé à la demande en avant. La fonction route elle-même ne fera que lancer la requête suivante, mais continuera à s'exécuter, y compris le bloc evaluation.save et l'envoi de la réponse, avant que cela ne se produise.

Vous devez déplacer les appels evaluation.save et res.json dans le gestionnaire end afin qu'ils ne s'exécutent pas tant que vous n'avez pas collecté les données requises.

Si cela n'a pas de sens, lisez la boucle d'événements dans Node.js. This est un bon point de départ.