无法使用节点

时间:2015-09-01 20:13:36

标签: ajax node.js mongodb put

希望有人可以在这里指出我的错误。

在我的应用中,用户点击按钮将文档插入数据库。当他们点击另一个按钮时,会将时间戳添加到数组中。

以下是创建文档的代码(可行):

// Add User
function addUser(event) {
event.preventDefault();

ident = makeWords(2);

    var newUser = {
        'ident' : ident,
        'group': '',
        'timestamps': [],
        'date_created': Date()
    }

    // Use AJAX to post the object to our adduser service
    $.ajax({
        type: 'POST',
        data: newUser,
        url: '/users/adduser',
        dataType: 'JSON'
    }).done(function( response ) {

        if (response.msg === '') {
            console.log('user added');
        } else {
            alert('Error');
        }
    });
};

这是处理它的路线:

/*
 * POST to adduser.
 */
router.post('/adduser', function(req, res) {
    var db = req.db;
    var collection = db.get('testcol'); //'testcol' is the name of my collection
    collection.insert(req.body, function(err, result){
        res.send(
            (err === null) ? { msg: '' } : { msg: err }
        );
    });
});

我认为更新文档同样容易。我正在通过ident字段抓取doc,这对每个用户都是唯一的。但是,我似乎无法将客户端的东西传递给服务器。这是我的客户端更新:

function addError(event) {
event.preventDefault();

    // If it is, compile all user info into one object
    var errorUpdate = {
        '$push': {'error_button': Date()}
    }

    // Use AJAX to post the object to our adduser service
    $.ajax({
        type: 'PUT',
        data: errorUpdate,
        url: '/users/errorUpdate',
        dataType: 'JSON'
    }).done(function( response ) {

        if (response.msg === '') {
            console.log("update sent, didn't receive an error");
        }
        else {
            alert('Error');
        }
    });
};

此代码执行,但服务器端只会抛出500秒。这是函数:

 /* 
 * update mongo doc
 */

router.put('/errorUpdate', function(req, res) {
    var db = req.db;
    var collection = db.get('testcol');
    collection.update({'ident': ident},req.body, function(err, result){             
if (err) {
            console.log('Error updating menu: ' + err);
            res.send({'users.js: error':'An error has occurred'});
        } else {
            console.log('doc has been updated');
            res.send(item);
        }
    });
});

知道我哪里出错了?

1 个答案:

答案 0 :(得分:0)

I solved this and it was a really really stupid mistake.

You might notice in my server-side code I use a variable called ident:

router.put('/errorUpdate', function(req, res) {
var db = req.db;
var collection = db.get('testcol');
collection.update({'ident': ident},req.body, function(err, result)...

ident is a global variable from my client-side stuff (global.js, which makes the ajax call), and it never made it to the server.

Further, I tried to send the Mongo update statement with the ident variable, which is totally unnecessary and just caused headaches.

Here's how I fixed it. This is client-side (where I only send the ident variable):

function addError(event) {
event.preventDefault();

    // If it is, compile all user info into one object
    var identifyMe = {
        'ident': ident
    }

    // Use AJAX to post the object to our adduser service
    $.ajax({
        type: 'POST',
        url: '/users/errors',
        data: identifyMe,
        dataType: 'JSON'
    }).done(function( response ) {
        // Check for successful (blank) response
        if (response.msg === '') {
            console.log('update sent, no errors received');
        }
        else {
            console.log('Error detected. Response was: ' + response);

        }
    });
};

... and this is server-side, where I take that identifier and do the update (this works because all I'm doing is inserting a time stamp):

router.post('/errors', function(req, res) {
console.log(req.body);
var identifier = req.body.ident;
var db = req.db;
var collection = db.get('testcol');
collection.update({'ident': identifier}, {$push: {'error_button': Date()}}, function(err, result){
    res.send(
        (err === null) ? { msg: '' } : { msg: err }
    );
});
});

You might notice that I'm pulling out that ident variable from the JSON that's being passed, with req.body.ident.

Hope this helps someone else struggling with updating a Mongo doc by posting to Express routes via Ajax with Node! :)