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

问题描述 投票:0回答:10

我正在使用 NodeJS 和 Express(以及更多东西,如 mongo、sockets 等)开发一个 API,但我认为我被困在一个非常简单的步骤上。我只是想从 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));
我得到
undefined
res.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 请求时传递的任何内容(我将其作为 JSON 传递) .

**我知道我可以使用

restify
sails.js
在 Node 中构建 API,但我想自己做所有事情,这样我就可以从经验中学习。*

谢谢

编辑: 我必须将

bodyparser
中间件放在
app.router
中间件之前,这样就解决了!

javascript json node.js express sails.js
10个回答
41
投票

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

15
投票

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

之一

4
投票

BodyParser 不再与 Express 捆绑

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

1
投票

对我而言,@kevinblanco 的注释是“我不得不将 bodyparser 中间件放在 app.router 中间件之前,这样就解决了!”为我做的。把它放在一个单独的答案中,因为它埋在底部。

您的代码需要如下所示:

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
投票

上面列出的大部分答案都是正确的,但目前 [28-July-2020] 最合适的是使用内置的 express 即:

app.use(express.json());

这将充当 中间件 以接受请求中传入的 JSON 对象


1
投票

在我的例子中,我必须添加这两行来阅读帖子请求正文

app.use(express.json());

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

0
投票

在 Golang 中,您可以在向 nodejs 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)
})

0
投票

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

app.use(express.json());


0
投票

您必须安装

bodyParser
,然后像这样在您的应用程序上使用它:

// middlewares
app.use(bodyParser.json());
app.use(sucursalRoutes);
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

希望对您有所帮助。


0
投票

你不需要

bodyParser
。只需添加以下行 -

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
© www.soinside.com 2019 - 2024. All rights reserved.