【问题标题】:How can I properly send Objects via AJAX using bodyParser in node.js express?如何在 node.js express 中使用 bodyParser 通过 AJAX 正确发送对象?
【发布时间】:2014-05-21 05:36:07
【问题描述】:

我正在努力:

$.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() 正在打印 undefined 并得到以下结果:

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

在服务器 GET 路由代码中,我无法理解 bodyParser 是如何生成 Object 的?

对于我之前尝试过的非常相似的 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) {...}
    ....
}

即使这纯粹是在客户端,我也很困惑如何处理 Objects/JSON 序列化以及 bodyParser 如何为它工作。

【问题讨论】:

  • 那么console.log( JSON.stringify(psycologist) ) 会产生什么(甚至更好)呢?你也应该在你的$ajax 请求中这样做,以序列化data: JSON.stringify( this.psycho )
  • 我也越来越不确定了。

标签: javascript node.js ajax mongodb


【解决方案1】:

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

$.ajax({
    type:"POST",
    contentType: "application/json",
    url:"/psychos",
    data: JSON.stringify( this.pyscho )
})

所以调用 JSON.stringify 以便序列化为 JSON,然后正文解析器有一些东西要解析。

【讨论】:

  • 我尝试在客户端(在 Angular 控制器内)使用 JSON.stringify( this.pyscho ),在服务器端使用 JSON.parse(request.body.psycho),但仍然失败
  • @diegoaguilar 如果您使用的是正文解析器,那么您不需要再次解析,因为它已经完成了。
  • 也试过了,但也失败了:TypeError: Cannot read property '_id' of undefined 和很多堆栈跟踪
  • @diegoaguilar 重要的是在第一个console.log 中看到request.body.pyscho 的结果。尝试记录request.body,因为那里的数据可能不是您认为的那样。我猜你认为你发布的数据会在 psycho 键下,但它可能不是。
  • @diegoaguilar 拼写错误stringify。无论如何,你的问题得到了回答。感谢您的认可。
【解决方案2】:
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)
})
})

【讨论】:

  • 谢谢@raju,你能不能扩展你的问题并解释一下。还有一个问题。在console.log("Se ha insertado: "+ JSON.strinfigy(responseFromDB)) 我收到一个错误:TypeError: Object #<Object> has no method 'strinfigy' 为什么?
  • @diegoaguilar request.body 如果您需要该对象的特定键值,则具有 post 对象意味着您可以使用 req.body.urObjKeyName 如果您想要整个对象意味着您应该使用 req.body..然后将 JSON.strinfigy 更改为 JSON.stringify...
猜你喜欢
  • 2019-08-31
  • 2012-09-07
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多