我有一个访问本地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来解决的问题吗?
答案 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
来获取单个文档,因为它在第一个回调中作为单个文档返回。