请求主体未定义

时间:2019-02-14 07:02:21

标签: node.js express

我使用Express.js制作api。

我面临的问题是访问请求正文。

当api在server.js上时,我可以访问正文。

// backend/server.js
const express = require("express");
const app = express();
const bodyParser = require("body-parser");

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

app.post("/hello", (req, res) => {
  console.log(req.body);
});

postman post request to "/hello"

successfully working api

所以这很好。那很好。但是,在这种情况下不起作用。

// backend/server.js
app.use(require("./routes"));


// backend/routes/index.js
const express = require("express");
const router = express.Router();

router.use("/api", require("./api"));

module.exports = router;


// backend/routes/api/index.js
const express = require("express");
const router = express.Router();

router.use("/users", require("./users"));

module.exports = router;


// backend/routers/api/users.js
const router = require("express").Router();
router.post("/", auth.optional, (req, res, next) => {
    console.log("hello");
    console.log(req.body);
}

failed postman post request to "/api/users"

failed api

如您所见,此api / users api运行正常,但我无法访问请求主体:(

谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在第一个示例中,您使用以下行导入body-parser

const bodyParser = require("body-parser");

然后启用它:

app.use(bodyParser.json());

这两项都是必需的,以便req.body存在并包含您期望的-从请求流中获取的已解析JSON对象。

在第二个示例中,两行均缺失,因此req.bodyundefined。您需要将它们添加到样本中,然后它将起作用。

请注意,req.body不是由Express本身提供的,而是由body-parser中间件提供的扩展,因此您必须安装,导入并实际上use

有关如何使用body-parser的示例,请参见其文档,Express/Connect top-level generic部分或Express route-specific部分。

答案 1 :(得分:0)

您可以尝试使用body-parser或multer中间件,希望它对您有帮助

  npm install body-parser --save

然后在您的代码中完成

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

解析应用程序/ x-www-form-urlencoded

 app.use(bodyParser.urlencoded({ extended: false }))

解析应用程序/ json

   app.use(bodyParser.json())

如果您的身体解析器不起作用,请尝试使用兼容的中间件

var express = require('express')
var app = express()
var multer  = require('multer')
var upload = multer()

app.post('/profile', upload.none(), function (req, res, next) {
    // req.body contains the text fields
})