Javascript 如何使用node.js express中的bodyParser通过AJAX正确发送对象?

Javascript 如何使用node.js express中的bodyParser通过AJAX正确发送对象?,javascript,node.js,ajax,mongodb,Javascript,Node.js,Ajax,Mongodb,我正在努力做到: $.ajax({ type:"POST", url:"/psychos", data:JSON.stringify(this.psycho) }) 在服务器上,我得到: app.post("/psychos", function(request, response) { var psychologist = request.body.psycho consol

我正在努力做到:

$.ajax({
    type:"POST",
    url:"/psychos",
    data:JSON.stringify(this.psycho)        
})
在服务器上,我得到:

app.post("/psychos", function(request, response) {

    var psychologist = request.body.psycho
    console.log(psychologist)


    psicologosCollection.insert(psychologist, function(error, responseFromDB) {

        if (error) {response.send(responseFromDB)}
        
        console.log("Se ha insertado: "+ JSON.strinfigy(responseFromDB))
        response.send(responseFromDB)
    })
})
但是,
console.log()
正在打印未定义的

TypeError: Cannot read property '_id' of undefined
    at insertWithWriteCommands (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/mongodb/lib/mongodb/collection/core.js:78:13)
    at Collection.insert (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/mongodb/lib/mongodb/collection/core.js:30:7)
    at Object.handle (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/server.js:117:25)
    at next_layer (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express/lib/router/route.js:103:13)
    at Route.dispatch (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express/lib/router/route.js:107:5)
    at c (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express/lib/router/index.js:195:24)
    at Function.proto.process_params (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express/lib/router/index.js:251:12)
    at next (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express/lib/router/index.js:189:19)
    at next (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express/lib/router/index.js:166:38)
    at Layer.session [as handle] (/home/diegoaguilar/DigitalOcean/psicologostuxtepec/node_modules/express-session/index.js:98:29)
我以前使用的是
BodyParser

var bodyParser  = require('body-parser')
app.use(bodyParser())
psycho实际上是一个有效的现有对象。在执行AJAX的方法中,
console.log(this.psycho)
将打印我的对象。我做错了什么

编辑: 即使我发现我应该得到:

var psychologist = request.body.psycho
在服务器获取路由代码时,我无法理解bodyParser如何生成对象

对于我以前尝试过的一个非常类似的AJAX调用:

function getSendingJSON(url,reqObject,callBack)  {
    $.ajax({
        type: "get",
        data: reqObject,
        dataType: "json",
        url: url,
        success: function(response){
           callBack(response);
        }
    });
}
所以响应是JSON,回调函数类似于:

function plotReglaFalsa(respuesta) {

    if (respuesta.fail) {...}
    else if (respuesta.negative) {...}
    ....
}

即使只是在客户端,我也不知道如何处理对象/JSON序列化以及bodyParser如何处理它。

您还没有序列化请求中的数据,在将其序列化为JSON之前,它仍然只是一个JavaScript对象:

$.ajax({
类型:“POST”,
contentType:“应用程序/json”,
网址:“/Psycho”,
数据:JSON.stringify(this.pyscho)
})

因此,调用
JSON.stringify
将其序列化为JSON,然后主体解析器将进行解析。

您尚未序列化请求中的数据,在将其序列化为JSON之前,它仍然只是一个JavaScript对象:

app.post("/psychos", function(request, response) {
 //change request.body.psycho to request.body
 var psychologist = request.body
 console.log(psychologist)
 psicologosCollection.insert(psychologist, function(error, responseFromDB) {

 if (error) {response.send(responseFromDB)}

    console.log("Se ha insertado: "+ JSON.stringify(responseFromDB))
    response.send(responseFromDB)
})
})
$.ajax({
类型:“POST”,
contentType:“应用程序/json”,
网址:“/Psycho”,
数据:JSON.stringify(this.pyscho)
})

因此,调用
JSON.stringify
将其序列化为JSON,然后主体解析器会有一些东西需要解析。

那么,控制台.log(JSON.stringify(心理医生))会产生什么(甚至更好)
呢?你也应该在你的
$ajax
请求中这样做,并序列化
数据:JSON.stringify(this.psycho)
我也没有定义。可能是重复的,那么从控制台.log(JSON.stringify(psycologist))中得到什么(甚至更好)呢?你也应该在你的
$ajax
请求中这样做,同时序列化
数据:JSON.stringify(this.psycho)
我也没有定义。可能是我在客户端(在角度控制器内)用
JSON.stringify(this.pyscho)
JSON.parse(request.body.psycho)尝试的重复
在服务器端,但仍然是failing@diegoaguilar如果您使用的是body解析器,那么您不需要再次解析,因为它已经完成了,但它也失败了:
TypeError:无法读取未定义的
的属性'\u id'和大量stacktrace@diegoaguilar重要的是在第一个
控制台.log
中的
request.body.pyscho
中查看结果。尝试记录
request.body
,因为那里的数据可能与您认为的不一样。我猜你认为你发布的数据应该在
psycho
下,但可能不是。diegoaguilar拼写错误
stringify
。不管怎样,你的问题得到了回答。感谢您的支持。我在客户端(在Angular控制器中)尝试了
JSON.stringify(this.pyscho)
,在服务器端尝试了
JSON.parse(request.body.psycho)
,但仍然没有成功failing@diegoaguilar如果您使用的是body解析器,那么您不需要再次解析,因为它已经完成了,但它也失败了:
TypeError:无法读取未定义的
的属性'\u id'和大量stacktrace@diegoaguilar重要的是在第一个
控制台.log
中的
request.body.pyscho
中查看结果。尝试记录
request.body
,因为那里的数据可能与您认为的不一样。我猜你认为你发布的数据应该在
psycho
下,但可能不是。diegoaguilar拼写错误
stringify
。不管怎样,你的问题得到了回答。谢谢你的支持。谢谢@raju。你能回答一下你的问题并解释一下吗。还有一个问题。在
console.log(“Se-ha-insertado:+JSON.strinfigy(responseFromDB))
我得到一个错误:
TypeError:Object#没有方法“strinfigy”
为什么?@diegaoguilar request.body拥有post对象如果你需要该对象的特定键值意味着你可以使用req.body.urObjKeyName如果你想要整个对象意味着你应该使用req.body..然后将JSON.strinfigy更改为JSON.stringify…谢谢@raju can你延伸你的问题并解释一下。还有一个问题。在
console.log(“Se-ha-insertado:+JSON.strinfigy(responseFromDB))
我得到一个错误:
TypeError:Object#没有方法“strinfigy”
为什么?@diegaoguilar request.body如果你需要该对象的特定键值,就拥有post对象意味着你可以使用req.body.urObjKeyName如果你想要整个对象意味着你应该使用req.body..然后将JSON.strinfigy更改为JSON.stringify。。。
app.post("/psychos", function(request, response) {
 //change request.body.psycho to request.body
 var psychologist = request.body
 console.log(psychologist)
 psicologosCollection.insert(psychologist, function(error, responseFromDB) {

 if (error) {response.send(responseFromDB)}

    console.log("Se ha insertado: "+ JSON.stringify(responseFromDB))
    response.send(responseFromDB)
})
})