mongodb findoneandupdate没有返回响应也没有错误

时间:2016-07-09 09:28:29

标签: mongodb mongoose mean-stack mean.io database

我正在尝试向DB请求包含过滤器的项目:

{
    paid : true,
    'budget.credits': {$gt : 0},
    retrieveView : { $ne : userId }
}

并更新该项目以包含用户的ID,有点像“查看”功能,以便他不会再次看到相同的项目:

{       
    $inc : { "retrieveCount" : 1 } ,
    $addToSet: { retrieveView: userId } 
}

这是接收http.Get调用

的服务器端功能的示例
export function findOnePaidItem(req, res) {
    var userId = req.params.userId;

    return Item.findOneAndUpdate({
        paid : true,
        'budget.credits': {$gt : 0},
        retrieveView : { $ne : userId }
    },{         
        $inc : { "retrieveCount" : 1 } ,
        $addToSet: { retrieveView: userId } 
    },{
        maxTimeMS  : 1000
    })
        .then(responseWithResult(res))
        .catch(handleError(res));
}

当有结果返回时,此方法正常工作,但是当不再存在且适合过滤器的Item时,查询永远不会返回任何内容并继续加载,就像等待响应一样。

我尝试使用maxTimeMS选项,希望在过去一段时间后获得回报,但无济于事。

现在已经被这个问题搞砸了,任何在MongoDB中都知道这个特定问题的大师......?

更新#1 耆那教的建议

export function findOnePaidItem(req, res) {
    var userId = req.params.userId;

    return Item.findOneAndUpdate({
        paid : true,
        'budget.credits': {$gt : 0},
        retrieveView : { $ne : userId }
    },{         
        $inc : { "retrieveCount" : 1 },
        $addToSet: { retrieveView: userId } 
    },{
        maxTimeMS  : 100
    }).exec(function(err, res) {
        console.log(err); // null
        console.log(res); // null
        return res;
    })
        .then(responseWithResult(res))
        .catch(handleError(res));
}

两个变量在exec注释中都返回null,完全混淆>。<哈哈

更新#2 Stuart&约翰尼的建议

export function findOnePaidItem(req, res) {
    var userId = req.params.userId;

    return Item.findOneAndUpdate({
        paid : true,
        'budget.credits': {$gt : 0},
        retrieveView : { $ne : userId }
    },{         
        $inc : { "retrieveCount" : 1 },
        $addToSet: { retrieveView: userId } 
    },{
        maxTimeMS  : 100
    }).exec(function(err, result) {
        console.log(err); // null
        console.log(result); // returns Item from DB *Thank you Stuart Bourhill

        if(!result) {
            res.status(401).send("empty file");
        } else {
             res.status(200).json(result);
        }
        return;
    });
}

感谢 Stuart Bourhill 提供的宝贵建议,当然在编码时,我倾向于忽略重复的参数名称,尤其是使用Angular JS模块化引用时。在更新#1 的情况下,我复制了 res 参数。

为什么我有这么多问题>。<“

在Jain的帮助下成功修复了API调用,Stuart& Johnny的建议,我在使用Angular的 $ http.get 函数调用时遇到了错误。

server side error

当结果为空时似乎发生此错误,当存在结果时,返回调用成功结束。

执行代码片段(客户端):

Auth.getCurrentUser(function(user) {                

    console.log(user._id);
    if(user._id) {

        console.log("sending");
        return $http.get('/api/items/paid/' + user._id).then(function(data) {

            paidItemPageDetails = data; 
            console.log(data);
            return data;
        }).catch(function(err) {
            console.log(err);
            return err;
        });     
    } else {
        return {data:null};
    }       
});

非常感谢你们让我到目前为止,我非常满意并且< 3来到Stackoverflow大师:)

修复'hardStop'致命错误

https://github.com/angular-fullstack/generator-angular-fullstack/issues/1556

诀窍是不要将console.log作为一个对象,而不是console.log一个字符串对象,可以写成console.log(JSON.stringify(result));

干杯,让我知道这对你有帮助吗

0 个答案:

没有答案