猫鼬保存一个空对象

Posted

技术标签:

【中文标题】猫鼬保存一个空对象【英文标题】:mongoose saves an empty object 【发布时间】:2017-04-27 16:48:19 【问题描述】:

我在将数据保存到数据库时遇到问题,猫鼬保存了没有价值的空对象。使用平均堆栈。

控制器: 例如我发送一些“你好消息”

    $http(
            method: 'POST',
            url: '/api/message',
            headers: 'Content-Type': 'application/json',
            data: JSON.stringify(msg: $scope.message)      
        ).

        success(function(response) 
            console.log("Success " + JSON.stringify(response));
        ).

        error(function(response) 
            console.log("Error " + JSON.stringify(response));
        );

server.js

    var bodyParser = require('body-parser');
    app.use(bodyParser.urlencoded('extended':'true'));
    app.use(bodyParser.json());
    app.use(bodyParser.json(type: 'application/vnd.api+json'));

    var message = mongoose.model('Message', 
    message: String
    )

    app.post('/api/message', function(req,res) 
    var message = new Message(req.body);
    message.save(function(err) 
        if(err) throw err;

        console.log(message);
    )

    res.status(200).send();
    console.log(req.body);
    )

我的“hello”消息到达服务器,但 mongoose 保存了一个空对象

msg: "hello" // console.log(req.body);
"_id":"584ee18f169f902b7046e991","__v":0 // console.log(message);

我做错了什么??

【问题讨论】:

请添加您对Message的定义/声明。 我已经更新了我的问题 req.body 不会在没有正文解析器的情况下正确填充。你添加了express-js body-parser吗? 是的,我做到了,upadet 主题 【参考方案1】:

您的请求正文与 Message 定义不匹配。 req.body 包含 msg 属性,但 Message 需要 message 属性。

我会在您的角度控制器中交换以下行:

data: JSON.stringify(msg: $scope.message)    

到这里:

data: JSON.stringify(message: $scope.message)

如果您愿意,您还可以更新 Message 模型以拥有一个名为 msg 的属性,而不是更改您的角度代码。

【讨论】:

我偶然发现了一个类似的问题,发现 mongoose 会丢弃任何未在架构中定义的键值对。【参考方案2】:

您可以使用 es6 中的 spread 函数将 req.body 分配给新的 Message 对象。您应该尝试修改您的 server.js,如下所示

app.post('/api/message', function(req,res) 
var message = new Message( ...req.body );
message.save()
.then(msg => res.status(200).send())
.catch(err => console.log(err))
)

【讨论】:

model.save() in mongoose 返回一个承诺,您应该使用 .then() 函数发送响应,请参阅我编辑的答案。如果这能解决您的问题,请告诉我 对象传播仅在stage 3中,不是ES6。 服务器返回扩展函数的语法错误,语法错误意外令牌...【参考方案3】:

在正文中发送data 键对象时尝试此操作

 app.post('/api/message', function(req,res) 
    var message = new Message(req.body.data);
    message.save(function(err) 
        if(err) throw err;

        console.log(message);
    )

    res.status(200).send();
    console.log(req.body);
    )

【讨论】:

以上是关于猫鼬保存一个空对象的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬中的 findOne 返回空对象,然后返回正确的对象

带有嵌套地图的 Promise.all .. 第一张地图仅适用于其他人在猫鼬中返回空对象

减少返回空数组

笑话测试显示对象可能是“空”错误

Mongoose:无法将数据保存到空对象

保存对象上的休眠空指针