使用Express.js无法从请求中获取POST正文

时间:2013-12-04 16:44:14

标签: javascript json node.js express sails.js

我正在研究一个带有NodeJS和Express的API(以及更多东西,如mongo,套接字等),但我坚持一个非常简单的步骤,我相信,我只是想从POST获取信息req对象,但在尝试访问req.body

时出错

这就是我所拥有的:

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'));     
});

console.log(JSON.stringify(req.body));我得到undefinedres.send(req.body.self);我得到TypeError: Cannot read property 'self' of undefined

我一直在搜索此类错误,通常问题是人们不包含app.use(express.bodyParser());中间件,我也尝试使用app.use(express.urlencoded());app.use(express.json());,但没有工作任

如果我做了console.log(req)我可以看到整个对象,但我没有看到body或我在从客户端发出POST请求时传递的任何内容(i'我把它传递给JSON)。

* 我知道我可以使用restifysails.js在Node中构建API,但我希望自己做所有事情,以便我可以从经验中学习。 < / p>

由于

编辑:

我必须将bodyparser中间件放在app.router中间件之前,修复它!

8 个答案:

答案 0 :(得分:31)

bodyParser中间件移到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);

答案 1 :(得分:8)

Content-Type = "application/json"应该是Request Headers

之一

答案 2 :(得分:2)

BodyParser不再与Express

捆绑在一起
npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));

答案 3 :(得分:1)

对于我来说,@ kevinblanco的注意事项&#34;我必须将bodysarser中间件放在app.router中间件之前,修复它!&#34;为我做了因为它埋在底部,所以把它放在一个单独的答案中。

您的代码需要看起来像这样:

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

答案 4 :(得分:0)

在Golang中,您可以在对Node.js Express路由器执行POST HTTP客户端请求之前,将Content-Type设置为application / json:

//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)
})

答案 5 :(得分:0)

Express有一个内置的方法,用于识别来自客户端的POST请求中的JSON对象。您可以在index.js文件中使用它,而不是使用body-parser:

app.use(express.json());

答案 6 :(得分:0)

上面列出的大多数答案都是正确的,但目前[2020年7月28日],最合适的方法是使用内置的快速表达方式,即:

app.use(express.json());

这将用作中间件,以接受您请求中的传入JSON对象

答案 7 :(得分:0)

在我的情况下,我必须添加这两行来读取帖子请求正文

app.use(express.json());

// add this middleware to read post request body
app.use(express.text());