2014년 12월 26일 금요일

writeConcern requires callback [newbie]

Error: writeConcern requires callback
    at updateWithWriteCommands (/home/greg/nodejs-module/app/server/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection/core.js:530:11)
    at Collection.update (/home/greg/nodejs-module/app/server/node_modules/mongoose/node_modules/mongodb/lib/mongodb/collection/core.js:646:12)
    at NativeCollection.(anonymous function) [as update] (/home/greg/nodejs-module/app/server/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:135:28)
    at NodeCollection.update (/home/greg/nodejs-module/app/server/node_modules/mongoose/node_modules/mquery/lib/collection/node.js:61:19)
    at Query.update (/home/greg/nodejs-module/app/server/node_modules/mongoose/node_modules/mquery/lib/mquery.js:1939:20)
    at Query.update (/home/greg/nodejs-module/app/server/node_modules/mongoose/lib/query.js:1760:28)
    at Function.update (/home/greg/nodejs-module/app/server/node_modules/mongoose/lib/model.js:1638:13)
    at model.update (/home/greg/nodejs-module/app/server/node_modules/mongoose/lib/document.js:367:34)
    at onPostMenuUpdate (/home/greg/nodejs-module/app/server/requests/postRequests.js:74:10)
    at Layer.handle [as handle_request] (/home/greg/nodejs-module/app/server/node_modules/express/lib/router/layer.js:82:5)

the related function is:

var onUpdate = function (err, num, raw) {
    if (!err) {
    logger.info('information stored');
    return myResponse.send ({status: 'ok' });
    } else {
    logger.info (err);
    if(err.name == 'ValidationError') {
            myResponse.statusCode = 400;
            myResponse.send({ error: 'Validation error'});
            logger.info(req.body);
        } else {
            myResponse.statusCode = 500;
            myResponse.send({ error: 'Server error' });
        }
    logger.error('internal error(%d):%s');
    }
}  
 

function onPostMenuUpdate (request,response) {
   logger.info("In onPostMenuUpdate");
    myResponse=response;
    var menu = new model.MainMenuModel ({
    'name': request.body.name,
    'link': request.body.link,
    'drop': request.body.drop
    }); 
    var menuObject=menu.toObject();
    
    menu.update({name:request.body.name}, menuObject, {upsert: true}, onUpdate);
}

How can i avoid this error.



P.S., to find these things yourself, think about what "Error: writeConcern requires callback" means (probably that you're missing a callback for something that writes [only thing that writes here is menu.update]), and look at the documentation for mongoose http://mongoosejs.com/docs/api.html#document_Document-update.



Comes from the line "menu.update({name:request.body.name}, menuObject, {upsert: true}, onUpdate)"

It's because mongoose update takes three arguments: document, options, callback.  You have object, object, options, callback; thus mongoose thinks your options object is the callback.

rewrite as:

var onUpdate = function (err, num, raw) {
    if (!err) {
    logger.info('information stored');
    return myResponse.send ({status: 'ok' });
    } else {
    logger.info (err);
    if(err.name == 'ValidationError') {
            myResponse.statusCode = 400;
            myResponse.send({ error: 'Validation error'});
            logger.info(req.body);
        } else {
            myResponse.statusCode = 500;
            myResponse.send({ error: 'Server error' });
        }
    logger.error('internal error(%d):%s');
    }



function onPostMenuUpdate (request,response) {
   logger.info("In onPostMenuUpdate");
    myResponse=response;
    var menu = new model.MainMenuModel ({
    'name': request.body.name,
    'link': request.body.link,
    'drop': request.body.drop
    });
    var menuObject=menu.toObject();
    menuObject.name = request.body.name
    
    menu.update(menuObject, {upsert: true}, onUpdate);
}

& that should work



Comes from the line "menu.update({name:request.body.name}, menuObject, {upsert: true}, onUpdate)"

It's because mongoose update takes three arguments: document, options, callback.  You have object, object, options, callback; thus mongoose thinks your options object is the callback.



I nearly replied with a similar response, but then I realized the code is actually calling Model#update, not Document#update. The former actually does take 4 arguments and from a cursory look it seems the calling code is using it more or less correctly.

That said, I agree that changing this to Document#update is probably still the correct solution.



You are correct. I think I distracted myself with the links I provided and forgot why I pasted them, which was to show the OP where their confusion likely came from.

Thanks for calling me on it so the misleading information wasn't left as the final word.



Ahhh yes that does make a lot of sense, could definitely see OP (or anyone) getting confused if they came across the model.update docs before the document.update ones.  Thank *you* for being so exceedingly polite & respectful, you're awesome. :)


댓글 없음:

댓글 쓰기