Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Json bodyParser不';它似乎起作用了_Json_Node.js_Express_Body Parser - Fatal编程技术网

Json bodyParser不';它似乎起作用了

Json bodyParser不';它似乎起作用了,json,node.js,express,body-parser,Json,Node.js,Express,Body Parser,很抱歉,如果这个问题听起来很“简单”,但我无法让主体解析器处理这个非常简单的示例: "use strict"; const PORT = 3000; const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.post("/api/login", (req, res) => { if (!req.body) return res.s

很抱歉,如果这个问题听起来很“简单”,但我无法让
主体解析器
处理这个非常简单的示例:

"use strict";

const PORT = 3000;
const express = require("express");
const bodyParser = require("body-parser");
const app = express();

app.post("/api/login", (req, res) => {
  if (!req.body) return res.sendStatus(400);
  res.send("welcome, " + req.body.username);
});


app.use(express.json());
app.use(bodyParser.json());

console.log(`Listen on port ${PORT}`);
app.listen(PORT);
要尝试此操作,请执行以下命令行:

curl-H“内容类型:application/json”-X POST-d'{“用户名”:“xyz”,“密码”:“xyz”}”http://localhost:3000/api/login

它总是以400作为回应!我尝试了很多配置,但没有找到解决方案

我相信这很简单,因为似乎没有人会犯同样的错误,所以我遗漏了一些东西,但不知道是什么

快递:4.16.2

正文解析器:1.18.2

谢谢你的帮助

编辑:解决方案是我需要将中间件放在路由定义之前。在我的例子中,
body解析器
不需要,我可以使用
express.jon()
内置API

"use strict";

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

app.use(express.json());

app.post("/api/login", (req, res) => {
  if (!req.body) return res.sendStatus(400);
  res.send("welcome, " + req.body.username);
});

console.log(`Listen on port ${PORT}`);
app.listen(PORT);

在路由定义之后,将bodyparser安装为中间件。通常,您希望在路由之前定义预路由中间件,或者将路由分离到不同的文件

只需按如下方式重新排列代码:

'use strict'

const PORT = 3000
const express = require('express')
const bodyParser = require('body-parser')
const app = express()

app.use(bodyParser.json()) // note: this is before the route

app.post('/api/login', (req, res) => {
  console.log(req.body)
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})

app.use(express.json())

console.log(`Listen on port ${PORT}`)
app.listen(PORT)
如果希望在单独的文件中使用bodyparser作为中间件,常用方法如下:

'use strict'

const PORT = 3000
const express = require('express')
const bodyParser = require('body-parser')
const app = express()

app.use(bodyParser.json()) // note: this is before the route

app.post('/api/login', (req, res) => {
  console.log(req.body)
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})

app.use(express.json())

console.log(`Listen on port ${PORT}`)
app.listen(PORT)
routes/someroute.js

const bodyParser = require('body-parser')
const jsonParser = bodyParser.json()

module.exports = (app) => {

  app.post('/a/route', jsonParser, (req,res) => {
      ...
  })

}

尝试将
app.use(bodyParser.json())
行放在你的
app.post
routeI知道这是一个明显的问题!!!我没有意识到在路由定义之前需要定义express中间件。谢谢你的帮助!为了澄清第二部分:通过这种方式,我们可以在不同的路由/文件中使用不同的主体解析器配置,而不是在所有路由之前全局使用配置。谢谢您的回答!我意识到不需要
body解析器
,因为内置的
express.json()
做同样的事情。为了简化我的代码,我将编辑我的问题:)。