Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js req.body未定义_Node.js_Express - Fatal编程技术网

Node.js Express.js req.body未定义

Node.js Express.js req.body未定义,node.js,express,Node.js,Express,我将此作为Express服务器的配置 app.use(app.router); app.use(express.cookieParser()); app.use(express.session({ secret: "keyboard cat" })); app.set('view engine', 'ejs'); app.set("view options", { layout: true }); //Handles post requests app.use(express.bodyPars

我将此作为Express服务器的配置

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());
但是当我请求
req.body.something
在我的路由中,我仍然得到一些错误,指出
body是未定义的。以下是使用
req.body
的路由示例:

app.post('/admin', function(req, res){
    console.log(req.body.name);
});
我读到这个问题是由于缺少
app.use(express.bodyParser())但正如你所看到的,我在路由之前调用它

//MY ROUTES
app.use("/api", authRoutes);

有什么线索吗?

没有。在
app.use(app.router)
之前,你需要使用
app.use(express.bodyParser())
。事实上,
app.use(app.router)
应该是你打电话的最后一件事。

正如我在一条评论下所说的,我用

app.use(require('connect').bodyParser());
而不是

app.use(express.bodyParser());
我仍然不知道为什么简单的
express.bodyParser()
不起作用…

2020年7月更新
express.bodyParser()
不再作为express的一部分捆绑。在加载之前,您需要单独安装:

npm i body-parser

// then in your app
var express = require('express')
var bodyParser = require('body-parser')
 
var app = express()
 
// create application/json parser
var jsonParser = bodyParser.json()
 
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
 
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  res.send('welcome, ' + req.body.username)
})
 
// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
  // create user in req.body
})
有关更多信息,请参阅

原文如下 在定义管线之前,必须确保定义了所有配置。如果这样做,您可以继续使用
express.bodyParser()

例如:

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
});

app.listen(port);
    
app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});
需要告知express.bodyParser()正在解析的内容类型。因此,您需要确保在执行POST请求时,包含了“Content Type”头。否则,bodyParser可能不知道如何处理POST请求的主体

如果您使用curl来执行一个POST请求,该请求在主体中包含一些JSON对象,它将如下所示:

curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute

如果使用另一种方法,只需确保使用任何适当的约定设置标题字段。

请求标题中的内容类型非常重要,尤其是当您发布来自curl或任何其他工具的数据时


确保您使用的是application/x-www-form-urlencoded、application/json等,这取决于您的帖子数据。将此字段留空将混淆Express。

要工作,您需要应用之后使用(app.router)使用(Express.bodyParser()),如下所示:

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);

看起来主体解析器不再随express一起提供。我们可能需要单独安装

var express    = require('express')
var bodyParser = require('body-parser')
var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))
app.use(function (req, res, next) {
console.log(req.body) // populated!

有关更多信息和示例,请参阅git页面。

最新版本的Express(4.x)将中间件与核心框架分离。如果需要主体解析器,则需要单独安装

npm install body-parser --save
然后在代码中执行此操作

var bodyParser = require('body-parser')
var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

我今天想到了这件事。以上解决方案都不适合我。但谷歌搜索帮助我解决了这个问题。我正在为微信第三方服务器编码

当node.js应用程序需要读取流式POST数据(例如来自REST客户端的请求)时,事情会变得稍微复杂一些。在这种情况下,请求的属性“readable”将设置为true,并且必须分块读取POST数据才能收集所有内容


这节省了我的时间。

首先,通过调用以下命令确保您已安装名为“body parser”的npm模块:

npm install body-parser --save
然后确保在调用routes之前包含以下行

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.json());
浪费了很多时间:

取决于客户端请求中的内容类型
服务器应具有以下应用程序之一的不同应用程序。使用()

资料来源:

示例:

对我来说, 在客户端,我有以下标题:

Content-Type: "text/xml"
因此,在服务器端,我使用了:

app.use(bodyParser.text({type: 'text/xml'}));

然后,req.body工作正常。

您可以使用express body解析器

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));

以防有人遇到与我相同的问题;我正在使用url前缀,如

http://example.com/api/
这是用路由器设置的

app.use('/api', router); 
然后我有以下几点

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
解决我的问题的方法是将bodyparser配置放在app.use('/api',router)之上

决赛

// setup bodyparser
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
    app.use('/api', router); 

express4具有内置的主体解析器。无需安装单独的主体解析器。因此,以下方法将起作用:

export const app = express();
app.use(express.json());

您可以尝试在顶部添加这行代码(在require语句之后):

至于它工作的原因,请查看文档:

使用app.Use(bodyparser.json())
在路由之前。//。
应用程序使用(“/api”,路线)

如果您使用某些外部工具发出请求,请确保添加标题:

内容类型:application/json

我用以下方法解决了它:

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});

这也是一种可能性:确保在app.js(或index.js)文件中的路由之前编写此代码


添加你的
app.js

在路由器呼叫之前

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

此问题可能是因为您没有使用主体解析器()


最新版本的Express已经内置了主体解析器。因此,您可以使用:

const express = require('express);
... 
app.use(express.urlencoded({ extended: false }))
.use(express.json());

由于缺少JSON解析器,大多数时候req.body是未定义的

const express = require('express');
app.use(express.json());
主体解析器可能缺少

const bodyParser  = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
有时由于CRO的来源而未定义,所以添加它们

const cors = require('cors');
app.use(cors())

在Express 4中,它非常简单

const app = express()
const p = process.env.PORT || 8082

app.use(express.json()) 

在我的例子中,这是因为在包含路由之后使用了主体解析器

//MY ROUTES
app.use("/api", authRoutes);
正确的代码应为

app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("_method"));
app.use(indexRoutes);
app.use(userRoutes);
app.use(adminRoutes);

它将有助于解决请求主体取消定义的问题

中间件始终作为第一个使用

//MIDDLEWARE
app.use(bodyParser.json());
app.use(cors());    
app.use(cookieParser());
在路线之前

//MY ROUTES
app.use("/api", authRoutes);

当我使用bodyParser时,它被标记为已弃用。为了避免这种情况,我将以下代码与express一起使用,而不是bodyParser

注意:必须最终宣布路线,这很重要!这里的其他答案很好地描述了这个问题

const express = require("express");
const app = express();

const routes = require('./routes/api');

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// Routes must declared finally
app.use('/', routes);

甚至移动
app.use(app.router)
下的
.use
调用也不能解决问题:(.经过一点挣扎后,我用
app.use解决了这个问题。使用(require('connect').bodyParser());
而不是
app.use(express.bodyParser());
。是的,即使使用
var router=express.router()时,答案也是正确的。)
;稍有补充,您仍应在app.routerBLESS此注释之后调用错误处理中间件
app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("_method"));
app.use(indexRoutes);
app.use(userRoutes);
app.use(adminRoutes);
app.use(express.json());
//MIDDLEWARE
app.use(bodyParser.json());
app.use(cors());    
app.use(cookieParser());
//MY ROUTES
app.use("/api", authRoutes);
const express = require("express");
const app = express();

const routes = require('./routes/api');

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// Routes must declared finally
app.use('/', routes);