Javascript 如何使用Express和MongoDB将json从nodejs服务器发送到客户端js文件
我是Nodejs和Express新手,希望从mongoDB搜索一些结果并在客户端浏览器上显示,我可以从mongoDB查询中找到值,但无法将其发送到客户端js文件, 它说doc没有定义,任何帮助都将不胜感激Javascript 如何使用Express和MongoDB将json从nodejs服务器发送到客户端js文件,javascript,json,node.js,mongodb,express,Javascript,Json,Node.js,Mongodb,Express,我是Nodejs和Express新手,希望从mongoDB搜索一些结果并在客户端浏览器上显示,我可以从mongoDB查询中找到值,但无法将其发送到客户端js文件, 它说doc没有定义,任何帮助都将不胜感激 ***app.js(Server)*** var bodyParser = require("body-parser"); var express = require("express"); var app = express(); var port = "8001"; var mongo=
***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);
}
});
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
}
});
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);
});
});
});
另请注意:
- 在将数据传递到查询中之前,应该对其进行清理
- 您不应该在每次请求时都连接到数据库,而应该在应用程序上下文中设置mongo
- 在尝试迭代光标之前,您应该检查
,查看mongo是否返回错误err
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
}
});
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);
});
});
});
有几件事:
已被弃用,取而代之的是cursor.each()
假设您正在运行最新版本的mongocursor.forEach()
- 回调中的第一行应该类似于
——此时您可能会看到查询无效:if(err){console.error(err)}
- 您的查询可能看起来像
.find({'name1':t.text,'name2':1,'u id':0})
- 如果将自动生成的mongo ObjectID引用为
,则必须使用\u id
,才能使其正常工作。如果在创建时未指定“u id”:new mongo.ObjectID()
,则自动生成的ObjectID将需要此id\u id
- 这些都很好,强烈建议翻阅它们以获取示例,哪些位采用哪些参数,以及所有这些参数的选项
- 考虑使用承诺而不是回访来帮助整理。mongo真的很简单-您只需不指定回调函数,而是在末尾添加一个
,一个,然后(document=>{…})
将捕获数据库、集合和光标级别的错误.catch(err=>{console.error(err)})
- 如果您正在执行AJAX
,您可能应该在其上附加一些POST
数据(以及
数据类型)。否则,您仍然不会得到任何记录,因为
将未定义或为空req.body
- 如果出现错误,您应该使用
,这样您就可以知道服务器端何时出了问题res.status(500)进行响应;res.end()
- 为了帮助您进行操作,
位于函数顶部,这样您就可以知道到达的数据console.log(req.body)
- 最后,如果您打算使用JSON进行响应,请使用
而不是res.JSON(doc)
res.send(doc)