2015-10-21 2 views
0

У меня есть странная ошибка, которую я не знаю, как обращаться или как управлять.Monk in nodejs иногда возвращает null на findAndModify

Проблема в том, что иногда, когда я пытаюсь обновить поле с помощью функции findAndModify, он возвращает мне null.

Я попытался отлаживать и выглядит так, как оба запроса одинаковы, просто отличный результат.

//THIS NOT 

{ database: 'testdb', 
    collection: 'mytable', 
    query: { _id: 5612454f228bd5b7428b456a }, 
    update: { '$inc': { int_lastid: 1 } }, 
    options: 
    { new: true, 
    fields: {}, 
    safe: true, 
    connection: 
     EventEmitter { 
     domain: null, 
     _events: [Object], 
     _eventsCount: 6, 
     _maxListeners: undefined, 
     socketOptions: [Object], 
     id: 0, 
     connected: true, 
     domainSocket: false, 
     minWireVersion: 0, 
     maxWireVersion: 3, 
     maxBsonSize: 16777216, 
     maxMessageSizeBytes: 48000000, 
     maxNumberOfDocsInBatch: 2000, 
     buffer: null, 
     sizeOfMessage: 0, 
     bytesRead: 0, 
     stubBuffer: null, 
     eventHandlers: [Object], 
     maxBsonSettings: [Object], 
     socketTimeoutMS: [Getter/Setter], 
     logger: [Object], 
     connection: [Object], 
     writeSteam: [Object], 
     maxWriteBatchSize: 1000, 
     serverCapabilities: [Object] }, 
    serializeFunctions: false, 
    checkKeys: false } } 



//THIS OK 
{ database: 'testdb', 
    collection: 'mytable', 
    query: { _id: 5612454f228bd5b7428b456a }, 
    update: { '$inc': { int_lastid: 1 } }, 
    options: 
    { new: true, 
    fields: {}, 
    safe: true, 
    connection: 
     EventEmitter { 
     domain: null, 
     _events: [Object], 
     _eventsCount: 6, 
     _maxListeners: undefined, 
     socketOptions: [Object], 
     id: 0, 
     connected: true, 
     domainSocket: false, 
     minWireVersion: 0, 
     maxWireVersion: 3, 
     maxBsonSize: 16777216, 
     maxMessageSizeBytes: 48000000, 
     maxNumberOfDocsInBatch: 2000, 
     buffer: null, 
     sizeOfMessage: 0, 
     bytesRead: 0, 
     stubBuffer: null, 
     eventHandlers: [Object], 
     maxBsonSettings: [Object], 
     socketTimeoutMS: [Getter/Setter], 
     logger: [Object], 
     connection: [Object], 
     writeSteam: [Object], 
     maxWriteBatchSize: 1000, 
     serverCapabilities: [Object] }, 
    serializeFunctions: false, 
    checkKeys: false } } 

Слишком много запросов может повлиять на результат?

Мой код следующий

 app.post('/findAndModify', function(req,res){ 
     res.append('Content-Type','application/json'); 
     if(req.body == undefined){ 
      res.status(400); 
      res.json({"status":400,"message":"Bad request."}); 
      res.end(); 
      return; 
     } 
     if(req.body.database == undefined || req.body.collection == undefined || req.body.query == undefined, req.body.update == undefined){ 
      res.status(400); 
      res.json({"status":400,"message":"Bad request."}); 
      console.log(req.body); 
      res.end(); 
      return; 
     } 
     _database = req.body.database; 
     _collection = req.body.collection; 
     _query = req.body.query; 
     _update = req.body.update; 
     _options = {}; 
     if(req.body.options != undefined) 
      _options = req.body.options; 
     //console.log(_options); 
     db = req.mongo.getConnection(_database); 
     collection.findAndModify(
      { 
       "query":_query, 
       "update": _update, 

      },_options,function(err,doc){ 
       if(err) 
       { 
        res.status(500); 
        res.json({"status":500, "message":err}); 
        res.end(); 
       } 
       else{ 
        res.status(200); 
        if(doc == null){ 
         console.log("//THIS NOT"); 
         console.log(util.inspect(req.body)); 
        } 
        else{ 
         console.log("//THIS OK"); 
         console.log(util.inspect(req.body)); 
        } 
        res.json(doc); 
        res.end(); 
       } 
      } 
     ); 

    }); 

ответ

0

Существует разница в приемлю опции и второй запрос не является действительным. Мое предположение заключается в том, что он игнорирует эту опцию и устанавливает ее значение по умолчанию (false). Вы можете узнать больше об этом here.

options: 
    { new: true} 
    fields: {}, 
    ... 
    } 

У вас есть сообщение об ошибке или проблема в том, что странное поведение?

+0

О, извините, моя ошибка, когда я скопировал и вставлял результат, добавленный мною добавленный мной после печати, его там не должно быть. – Sinjuice

+0

О, право. Вы пробовали другой запрос (найдите, например), с теми же данными? Будет легче отлаживать, если вы разделите операции, чтобы увидеть, что происходит. И возможное решение, которое я вижу, заключается в использовании оператора $ set в вашем запросе на обновление - «update»: {$ set: _update}. Я не уверен, что это решит проблему, но это обычный «решатель проблем» с findAndModify() в Monk. –

Смежные вопросы