Node.js Express.js req.body未定义
我将此作为Express服务器的配置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
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())
如果您发布SOAP消息,则需要使用原始正文解析器:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.raw({ type: 'text/xml' }));
我今天想到了这件事。以上解决方案都不适合我。但谷歌搜索帮助我解决了这个问题。我正在为微信第三方服务器编码
当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);
甚至移动app.use(app.router)
下的.use
调用也不能解决问题:(.经过一点挣扎后,我用app.use解决了这个问题。使用(require('connect').bodyParser());
而不是app.use(express.bodyParser());
。是的,即使使用var router=express.router()时,答案也是正确的。)
;稍有补充,你仍然应该在app.routerBLESS之后调用错误处理中间件。这个评论对我来说很有效。注意:不幸的是,有些教程(像我一样)让人将路由放在app.configure()之前。在我的例子中,这是以app.get/post等形式出现的,并且是一个requ
const app = express()
const p = process.env.PORT || 8082
app.use(express.json())
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);