我是Nodejs和Express的新手,想要从mongoDB中搜索一些结果并在客户端浏览器上显示它,我可以从mongoDB查询中找到值但不能将其发送到客户端js文件, 它说文档没有定义,任何帮助都将受到赞赏。
***app.js(Server)***
var bodyParser = require("body-parser");
var express = require("express");
var app = express();
var port = "8001";
var mongo= require('mongodb');
var mongoClient=mongo.MongoClient;
app.use(bodyParser.json());
app.use(express.static('public'));
app.get('/home', function(req, res) {
res.sendFile(__dirname + "/public/views/index.html");
});
app.listen(port, function() {
console.log("Server running at:" + port);
})
app.post("/response", function(req, res) {
var t = req.body;
mongoClient.connect("mongodb://localhost:27017/query", function(err,db){
cursor =db.collection('response').find({"name1":t.text},{"name2":1, "_id":0});
cursor.each(function(err, doc) {
if (doc != null) {
console.log(doc);
}
});
})
res.send(doc);
});
***index.js(Client Side)***
$.ajax({
url: '/response',
type:"POST",
contentType:"application/json; charset=utf-8",
complete: function(data) {
console.log(data.responseText);
alert(data.responseText);
}
});
答案 0 :(得分:1)
doc
是闭包的本地变量,因此在调用res.send(doc)时不可用。
除此之外,您正在迭代所有文档。你需要选择返回哪一个。
我推荐这样的东西:
cursor = db.collection('response').find({"name1":t.text},{"name2":1, "_id":0});
cursor.each(function(err, doc) {
if (doc != null) {
console.log(doc);
return res.json(doc); // return the first document found
}
});
另请注意:
err
以查看mongo在尝试迭代光标之前是否返回错误修改强>
更具体地说,整个块应如下所示:
app.post("/response", function (req, res) {
var t = req.body;
mongoClient.connect("mongodb://localhost:27017/query", function (err, db) {
if (err) {
return res.json(err);
}
db.collection('tweets').findOne({"name1": t.text}, {"name2": 1, "_id": 0}, function (err, doc) {
if (doc != null) {
console.log(doc);
return res.json(doc);
}
return res.sendStatus(404);
});
});
});
答案 1 :(得分:0)
cursor.each()
已被弃用,而不是cursor.forEach()
if (err) { console.error(err) }
- 此时你可能会看到你的查询无效:.find({'name1': t.text, 'name2': 1, '_id': 0})
_id
,则必须使用'_id': new mongo.ObjectID(<whatever string holds the _id>)
才能使其正常工作。如果您在创建时未指定_id
,则自动生成的ObjectID将需要此项。.then(document => { ... })
,而单个.catch(err => {console.error(err)})
将捕获db,collection和cursor级别的错误。< / LI>
.done(result => {...})
和.fail(err => { ... })
(又名承诺)代替complete
进行ajax调用,不管你做什么,都不要忘记附加错误处理程序。 (我甚至不确定'完整'是正确的属性,可能取决于你正在使用的jQuery)POST
,你应该附上一些data
(以及一个dataType
)。否则你仍然没有记录,因为req.body
将是未定义或为空。res.status(500); res.end()
回复,这样您就可以知道服务器端出现问题的时间。console.log(req.body)
就在您的功能顶部,以便您了解到达的数据。res.json(doc)
代替res.send(doc)