【问题标题】:Express 4 empty JSON queryExpress 4 空 JSON 查询
【发布时间】:2019-01-28 18:45:01
【问题描述】:

我使用 ReactJS 作为前端,使用 Nodejs (Express) 作为 API。我似乎无法获取 Nodejs 中的反应服务发送的请求的 JSON 值。我可以调用 POST 路由,甚至可以收到回复,但 req.body 似乎是空的。这是我在 React 中使用的 Fetch 函数:

static Post(url, bodyArgs){
return new Promise((resolve, reject) => {
  fetch(apiUrl+url, {
    method: 'POST',
    mode: "no-cors",
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(bodyArgs),
      //{eventID: 1}
  })
  .then((res) => res.json())
  .then((resJson) => {
    //console.log(resJson);
    return resJson;
  })
  .catch((err) => {
    //console.error(err);
    return err;
  });
});

}

这是我在路线上使用的代码 (accounts.js):

router.post('/login', function(req, res){
  res.json({requestBody: req.body}) 
  var username = req.body.username;
  var password = req.body.password;

  console.log(JSON.stringify(req.body))

  console.log("got it")

  console.log(username+" <> "+password);
  res.json(req.body);
});

我已经在我的 app.js 主文件中添加了 JSON 中间件:

var accountsRouter = require('./routes/accounts');
var usersRouter = require('./routes/users');
var eventsRouter = require('./routes/events');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/accounts', accountsRouter);
app.use('/users', usersRouter);
app.use('/events', eventsRouter);

为什么它不起作用?是因为我还必须在路由器文件中包含 Json 中间件吗?

编辑:我正在使用 Express@4.16.3

【问题讨论】:

  • “req.body 好像是空的”你能说的更具体点吗?
  • 好吧,当我尝试读取我发送的值时,里面没有值。它只是一个空数组,这意味着 JSON 实际上并没有被解析。
  • 所以JSON.stringify(req.body)返回一个包含[]的字符串?
  • console.log(JSON.stringify(req.body)) 返回{}

标签: node.js express


【解决方案1】:

我认为你错过了 bodyParser。 在你的 app.js 中添加 app.use(express.bodyParser()); 对于较新版本的 express > 4 尝试

var bodyParser = require('body-parser')
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

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

【讨论】:

  • 我正在使用 Express 4.16.3,这使得 bodyParser 被弃用。您可以在最后一个 sn-p 中看到我包含了新方法 express.json()
  • 之前它是 express body-parser 的一部分。现在您必须单独安装和导入它。即 npm install body-parser --save
  • express.json() 和 bodyParser 几乎是相同的模块,至少文档是这么说的。
【解决方案2】:

我发现了问题,这是由于 CORS。我将 fetch() CORS 参数设置为 no-cors,这意味着浏览器不能再执​​行高级请求,例如 JSON 或任何其他自定义标头。要解决此问题,您只需执行以下操作:

从你的 fetch 函数中移除这个参数:

mode: "no-cors"

然后在您的 Express 应用中添加以下代码:

// CORS enable
app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

现在您的 API 服务器接受了 CORS,一切都应该可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2017-02-02
    相关资源
    最近更新 更多