繁体   English   中英

如何在Express中访问我的req.body data / json?

[英]How can I access my req.body data/json in Express?

我是node.js的新手,我试图从post请求访问我的node.js服务器上的json,所以我可以将它发送到API并将其反馈给我的前端js文件。 我可以看到json对象,但在阅读了一些文档/ stackoverflow帖子后,我似乎无法访问它(例如:req.body.name)。

这是我的server.js文件和包的邮寄路线:

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


    // create application/json parser 
    app.use(bodyParser.json());
    // create application/x-www-form-urlencoded parser 
    app.use(bodyParser.urlencoded({
        extended: true
    }));

    app.post('/', function(req, res) {

    var test = req.body; //If I req.body.name here, it will return undefined
    console.log(test);

    });

这是我的前端map.js文件发布功能和数据:

  var locations = [
  {name:'Le Thai', coords:{lat:36.168743, lng:-115.139866}},
  {name:'Atomic Liquors', coords:{lat:36.166782, lng:-115.13551}},
  {name:'The Griffin', coords:{lat:36.168785, lng:-115.140329}},
  {name:'Pizza Rock', coords:{lat:36.17182, lng:-115.142304}},
  {name:'Mob Museum', coords:{lat:36.172815,lng:-115.141242}},
  {name:'Joe Vicari’s Andiamo Italian Steakhouse', coords:{lat:36.169437, lng:-115.142903}},
  {name:'eat', coords:{lat:36.166535, lng:-115.139067}},
  {name:'Hugo’s Cellar', coords:{lat:36.169915, lng:-115.143861}},
  {name:'Therapy', coords:{lat:36.169041, lng:-115.139829}},
  {name:'Vegenation', coords:{lat:36.167401, lng:-115.139453}}

  ];
   //convert array to JSON 
   var jsonStr = JSON.stringify(locations);

   $.post('http://localhost:3000/', jsonStr, function(data){
     //empty for now

   },'json'); 

最终目标:我希望能够访问我的数据,如req.body.name。 我尝试在req.body上使用typeof,它返回一个对象,但我似乎无法访问此对象。 我尝试使用JSON.parse,但实现了req.body已经是一个对象了。 我想最终将这些数据提供给Yelp API。

来自console.log(req.body)的当前输出(每个请求):

{ '{"name":"Le Thai","coords":{"lat":36.168743,"lng":-115.139866}},
{"name":"Atomic Liquors","coords":{"lat":36.166782,"lng":-115.13551}},
{"name":"The Griffin","coords":{"lat":36.168785,"lng":-115.140329}},
{"name":"Pizza Rock","coords":{"lat":36.17182,"lng":-115.142304}},
{"name":"Mob Museum","coords":{"lat":36.172815,"lng":-115.141242}},
{"name":"Joe Vicari’s Andiamo Italian Steakhouse","coords":
{"lat":36.169437,"lng":-115.142903}},{"name":"eat","coords":
{"lat":36.166535,"lng":-115.139067}},{"name":"Hugo’s Cellar","coords":
{"lat":36.169915,"lng":-115.143861}},{"name":"Therapy","coords":
{"lat":36.169041,"lng":-115.139829}},{"name":"Vegenation","coords":
{"lat":36.167401,"lng":-115.139453}}': '' }

你正在使用一个数组,所以它不会是:

req.body.name

但是例如

req.body[0].name

您可能希望迭代使用.forEachfor循环等获得的数组。

问题是你没有告诉服务器你发送它JSON,所以它没有得到解析。 另外,正如rsp所指出的 ,要访问名字,你需要req.body[0].name ,而不是req.body.name

$.post上的dataType参数不是告诉服务器发送它的 什么 ,而是告诉jQuery你期望从服务器返回什么。 要告诉服务器您要发送的内容,请使用$.ajaxcontentType选项:

$.ajax({
    url: 'http://localhost:3000/',
    type: "POST",
    contentType: "application/json",  // <====
    data: jsonStr,
    success: function(data){
     //empty for now
    }
});

现在, body-parser模块在请求中查看内容类型,并为您解析它。 例如,如果我更改您的服务器文件来执行此操作:

app.post('/', function(req, res) {
    req.body.forEach(function(entry, index) {
        console.log(index, entry.name)
    });
});

...然后通过上面对客户端代码的更改,我在服务器控制台上得到了这个:

0 'Le Thai'
1 'Atomic Liquors'
2 'The Griffin'
3 'Pizza Rock'
4 'Mob Museum'
5 'Joe Vicari’s Andiamo Italian Steakhouse'
6 'eat'
7 'Hugo’s Cellar'
8 'Therapy'
9 'Vegenation'

对于那些在req.body中获取空对象的人

我忘了在请求中设置标题:{“Content-Type”:“application / json”}。 改变它解决了这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM