Ich arbeite an einer API mit NodeJS und Express (und mehr Sachen wie Mongo, Sockets usw.), aber ich glaube, ich stecke in einem sehr einfachen Schritt fest. Ich versuche nur, die Informationen vom POST req -Objekt abzurufen, erhalte jedoch eine Fehlermeldung, wenn ich versuche, auf req.body zuzugreifen.

Folgendes habe ich:

var express     = require('express'),
    http        = require('http'),
    path        = require('path'),
    fs          = require('fs'),
    io          = require('socket.io');
    dynroute    = require('dynroute');

var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(app.router);
app.use(express.bodyParser());

app.post('/user', function(req, res) {

    console.log(JSON.stringify(req.body));
    res.send(req.body.self);
});

http.createServer(app).listen(app.get('port'), function ()
{
    console.log('App Server is now running at:' + app.get('port'));     
});

Auf dem console.log(JSON.stringify(req.body)); bekomme ich undefined und auf dem res.send(req.body.self); bekomme ich TypeError: Cannot read property 'self' of undefined

Ich habe nach dieser Art von Fehler gesucht und normalerweise ist das Problem, dass die Leute keine app.use(express.bodyParser()); Middleware enthalten, also habe ich auch versucht, app.use(express.urlencoded()); und app.use(express.json()); zu verwenden, was auch nicht funktioniert hat .

Wenn ich ein console.log(req) mache, kann ich das gesamte Objekt sehen, aber ich kann nicht body oder den Inhalt sehen, den ich übergebe, wenn ich die POST-Anfrage von einem Client ausführe (ich übergebe es) als JSON).

** Ich weiß, dass ich restify oder sails.js verwenden kann, um APIs in Node zu erstellen, aber ich möchte alles selbst tun, damit ich aus den Erfahrungen lernen kann. *

Vielen Dank

BEARBEITEN: Ich musste die bodyparser Middleware vor die app.router Middleware stellen, die das Problem behoben hat!

27
kevinblanco 4 Dez. 2013 im 20:44

5 Antworten

Beste Antwort

Bewegen Sie die Middleware bodyParser über die Middleware router!

var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(app.router);
33
Renato Gama 4 Dez. 2013 im 17:00

BodyParser wird nicht mehr mit Express gebündelt

npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
2
Tobias Artz 7 Mai 2015 im 00:17

Für mich @ kevinblancos Anmerkung von "Ich musste die Bodyparser-Middleware vor die app.router-Middleware stellen, die das Problem behebt!" habe es für mich getan. Setzen Sie es in eine separate Antwort, da es unten begraben ist.

Ihr Code muss ungefähr so aussehen:

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// My routing here
1
Ash Blue 17 Apr. 2014 im 22:18

Content-Type = "application/json" sollte einer der Request Headers sein

9
Akash 14 Aug. 2015 im 07:36

In Golang können Sie den Inhaltstyp als application / json festlegen, bevor Sie eine POST-http-Clientanforderung an den Express-Router von nodejs senden:

//Golang
import (    
    "bytes"
    "encoding/json"
    "errors"    
    "net/http"      
)

//method := "POST"
//url := "http://ip:port/api/router"

func request(method string, url string, data interface{}, pHeader map[string]string) {
    pBody, err := json.Marshal(data)
    if err != nil {
        return []byte{}, err
    }
    request, err = http.NewRequest(method, url, bytes.NewBuffer(pBody))
    if(err!=nil ){
        return []byte{}, err
    }
    request.Header.Set("Content-Type", "application/json")

    //add header params if any
    for key, head := range pHeader {
        request.Header.Add(key, head)
    }

    client := &http.Client{}
    resp, err := client.Do(request)
    if err != nil {
       return []byte{}, err
    }
    defer resp.Body.Close() 
}

//NODEJS

//app.js
var express = require('express');
...

var app = express();
app.use(express.json());


var router= require('path/to/router.js');
//use the router
app.use('/api', router);
...

//router.js    
router.post('/router', function (req, res, next) {
    //log request body to view its values of incoming request
    console.log('req.body', req.body)
})
0
Yudi Tjhia 13 Feb. 2020 im 05:51