【问题标题】:Node.js, Express and Mongoose, undefined dataNode.js、Express 和 Mongoose、未定义的数据
【发布时间】:2014-03-19 23:23:33
【问题描述】:

只是一个菜鸟问题:

我正在尝试使用属性“cover”来删除与该集合相关的文件,但问题是它显示为“未定义”。有没有人遇到过这样的问题??谢谢!!!

这是我的日志:

完整结果 - { __v: 0, _id: 5329a730e4b6306a08297318,

公司:'asd',

封面:'44f4a87035bd22c1995dcf0ab8af05b0',

描述:'asd',

种类:'asd',

名称:'asd' }

结果封面 - 未定义

这是我的代码:

exports.delete = function(req,res){

if(!req.session.authorized){
    res.json(403,{message:'YOU MUST BE LOGGED IN'});
    return;
}


Product.find({_id:req.params.id}, function(err,result){

    if (err){
        res.json(401, {message: err});

    }else{
        console.log("FULL RESULT - " + result);
        console.log("RESULT COVER - " + result.cover);

        var prodCoverName = result.cover;

        if (prodCoverName){

            fs.exists('public/productAssets/'+ prodCoverName, function (exists) {
                console.log('EXIST - public/productAssets/'+ prodCoverName);
                fs.unlink('public/productAssets/'+ prodCoverName, function (err) {

                    if (err) throw err;
                    console.log('DELETED AT public/productAssets/'+ prodCoverName);

                });

            });

        }

    } 

});

Product.findOneAndRemove({_id:req.params.id}, function(err,result){

    if (err) res.json(401, {message: err});
    else res.json(200, {message: result});

});

};

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    我不是猫鼬方面的专家,但我的猜测是 Product.find 函数将使用一组文档而不是单个文档调用它的回调,因此您应该使用以下代码更改代码:

    Product.find({_id:req.params.id}, function(err, results){
       var result = results[0]; // either one result or nothing, because id is unique and we want the first result only.
    

    或者改用findOne(这个回调第一个结果,更快):

    Product.findOne({_id:req.params.id}, function(err, result){
    

    或者使用findById(更短更快):

    Product.findById(req.params.id, function(err, result){
    

    现在你可能会问,为什么在我的例子中,FULL RESULT 是一个对象。以下是 javascript 中发生的情况:

    你有console.log("FULL RESULT - " + result),在这里你正在记录一个字符串并且你有一个字符串和一个数组之间的字符串连接操作。当您尝试将字符串与非字符串连接时,javascript 会尝试将其强制转换为字符串,因此在它不是 undefined/null 的情况下,它将调用该值的 .toString 方法。数组的.toString 方法实际上执行return this.join(',')join 方法也是一个字符串连接。该数组包含文档,因此 javascript 尝试将文档转换为字符串(它们实际上是对象)并调用 document.toString()。这是由 mongoose 实现的以返回对象属性,它应该类似于util.inpsect(document);。此事件的另一个示例是从'result is ' + [1] 获取result is 1

    为了避免这个问题,我建议,避免使用字符串连接对象。而不是console.log('result is ' + object) 尝试做console.log(object)console('result is', object)

    更新:

    我刚刚意识到你在调用 find 的同时也在调用 findOneAndRemove,这是一个竞争条件。 .find 调用可能找不到任何东西,因为 .findOneAndRemove 可能已经完成。这可能会带来更多问题。

    【讨论】:

    • 我已经改变了 Product.findById(req.params.id, function(err, result){ 正如你所说的......它现在工作得很好......我会尝试打一个电话只是为了避免将来出现问题。感谢您的解释!!非常感谢!非常感谢!!!XD
    • 欢迎您,以后尽量不要将字符串与对象连接起来,这样就不会再发生这种混淆了。
    • 当然...谢谢!!
    猜你喜欢
    • 2012-11-29
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2013-02-22
    • 2015-01-30
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多