2017-10-16 4 views
0

J'ai suivi this tutoriel et créé une application avec frontend/backend côté en angulaire. Je veux communiquer avec json via des appels de repos au backend. L'interface et le backend fonctionnent et je suis capable d'appeler les méthodes du backend. Sur le frontend, j'envoie un objet hero à backend mais du côté backend, l'objet body.hero est indéfini.npm express impossible d'obtenir l'objet de la demande en backend

frontend:

update(hero: Hero): Promise<Hero> { 
     const url = `${this.heroesUrl}/hero/update/${hero.id}`; 
     console.info('update url: '+url); 
     return this.http.put(url, JSON.stringify(hero), {headers: this.headers}) 
     .toPromise() 
     .then(() => hero).catch(this.handleError); 
    } 

back-end:

router.put('/heroes/hero/update/:id', (req, res) => { 
    let id = req.params.id; // 12 
    let z = req.body.params; 
    console.info("body: "+z); 
    let name = JSON.parse(req.body.hero).name; 
    console.info("saving hero: "+name+" with id: "+id); 
    client.query("update heroes set heroname=$2 where id_pk=$1)", [h, name]); 
    res.send(JSON.stringify("ok")); 
}); 

exception:

body: [object Object] 
SyntaxError: Unexpected token u in JSON at position 0 
    at Object.parse (native) 
    at router.put (C:\Users\Magamet\Documents\GitHub\angular-start-app\server\routes\api.js:64:19) 
    at Layer.handle [as handle_request] (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\ro 
uter\layer.js:95:5) 
    at next (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\router\route.js:137:13) 
    at Route.dispatch (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\router\route.js:112: 
3) 
    at Layer.handle [as handle_request] (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\ro 
uter\layer.js:95:5) 
    at C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\router\index.js:281:22 
    at param (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\router\index.js:354:14) 
    at param (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\router\index.js:365:14) 
    at Function.process_params (C:\Users\Magamet\Documents\GitHub\angular-start-app\node_modules\express\lib\router\inde 
x.js:410:3) 

Qu'est-ce que je fais mal? Y a-t-il une meilleure façon d'envoyer l'obj hero à backend dans json? Comment pourrais-je lire l'objet héros du côté backend?

Merci

Répondre

1

Il semble que votre objet héros est envoyé comme une chaîne JSON au back-end, ce qui signifie que req.body.hero est déjà analysé par votre routeur. Cela signifie que vous analysez une chaîne JSON déjà analysée. Vous avez besoin d'accéder uniquement comme tout autre objet de:

let name = req.body.hero.name; 
+0

, mais il dit 'TypeError: Impossible de lire le « nom » propriété de undefined' – ninjaxelite

+0

exigez-vous que le corps-analyseur? – Josherwoodev

+0

Je n'étais pas mais j'ai ajouté ceci: 'const bodyParser = require ('body-parser') const app = express() app.use (bodyParser.urlencoded ({étendu: false})) app.use (bodyParser.json()) 'mais cela ne fonctionne toujours pas la même erreur qu'avant – ninjaxelite