mongolab请求返回空的查找结果

时间:2015-08-11 17:02:43

标签: javascript node.js mongodb express web

我有一个访问本地node.js服务器的网站(访问mongolab数据库),但是当我使用前端函数请求用户JSON对象时,mongo数据库什么都不返回。 (JSON.parse()在第1行第1行找到意外的数据结尾)

以下是通过电子邮件和密码请求用户数据的前端功能:

function requestUser(email, password) {
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", "http://localhost:8888/getUser/" + email + "/" + password, true);
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
           user = JSON.parse(xmlhttp.responseText);
           console.log(user);
        }
    }
    xmlhttp.send();
}

这是node.js express服务器(后端):

 var http = require("http"),
    mongojs = require("mongojs"),
    express = require('express'),
    cors = require('cors'),
    fs = require("fs"),
    url = require("url");

app = express();
app.use(cors());

var uri = "mongodb://<dbuser>:<dbpassword>@ds036698.mongolab.com:36698/alirodatabase";
var db = mongojs(uri, ["Papers", "Users"]);

app.get('/getUser/:email/:passwd', function(req, res, next) {
  var users = db.Users.find({"email": req.params.email,
                            "password": req.params.passwd});
  user = users.toArray[0];
  res.json(user);
});

app.listen(8888, function() {
  console.log('CORS-enabled web server listening on port 8888');
});

编辑1:

app.get('/getUser/:email/:passwd', function(req, res, next) {
    var user = db.Users.findOne({
        "email": req.params.email,
        "password": req.params.passwd
    }, function(err, doc) {
            if (err) {
                res.json({error: 'error retrieving the JSON user' });
            }
            else {
                res.json(doc);
            }
    });
});

我向节点服务器添加了异步功能,但现在我收到了错误:&#34;错误检索JSON用户&#34;。这是一个可以通过托管我自己的数据库而不是使用mongolab来解决的问题吗?

1 个答案:

答案 0 :(得分:1)

您需要查看mongojs(https://github.com/mafintosh/mongojs)的文档。您根本没有使用回调。这些函数不是return值,因为它是Javascript / Node.js,它们就像异步一样。所以你必须使用回调来处理结果。这个想法是&#34;找到这些文件&#34;然后一段时间后,当它真正得到文件时,对文件做了些什么&#34;。

app.get('/getUser/:email/:passwd', function(req, res, next) {
    var users = db.Users.find({
        "email": req.params.email,
        "password": req.params.passwd
    }, function(err, docs) {
        if (err) {
            //handle the error
            res.json({error: ':(' });
        }
        else {
            docs.toArray(function(err, users) {
                if (err)  {
                    //handle the error
                    res.json({error: ':(' });
                }
                else {
                    res.json(users[0]);
                }
            });
        }
    });
});

最后,我建议使用findOne而不是find。然后,您不需要使用toArray来获取单个文档,因为它在第一个回调中作为单个文档返回。