如何使用Express和MongoDB将json从nodejs服务器发送到客户端js文件

我是Nodejs和Express的新手,想从mongoDB中search一些结果,并在客户端浏览器上显示,我可以从mongoDB查询中find值,但是不能发送给客户端js文件,它说没有定义doc,帮助将不胜感激。

***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是closures的局部variables,因此在调用res.send(doc)时不可用。

除此之外,您正在迭代所有文档。 你需要select哪一个返回。

我推荐这样的东西:

 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 } }); 

另请注意:

  • 在将数据传递给查询之前,应该清理数据
  • 你不应该连接到每个请求上的数据库,而应该在应用程序上下文中设置mongo
  • 你应该检查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); }); }); }); 

一些东西:

  • cursor.each()已经被弃用,赞成cursor.forEach()假设你正在运行mongo的最新版本
  • 你在callback中的第一行应该是if (err) { console.error(err) } – 在这一点上你可能会看到你的查询是无效的:
  • 你的查询应该看起来像.find({'name1': t.text, 'name2': 1, '_id': 0})
  • 如果引用一个自动生成的mongo ObjectID为_id ,则必须使用'_id': new mongo.ObjectID(<whatever string holds the _id>)才能工作。 如果你没有在创build时指定_id ,那么自动生成的ObjectID将需要这个。
  • 孟戈文档是伟大的,强烈build议翻阅他们的例子,哪些位需要哪些参数和所有的选项。
  • 考虑使用promise而不是callback来帮助整理。 mongo真的很简单 – 只是不指定callback函数,而是在最后加上一个.catch(err => {console.error(err)}) .then(document => { ... })和一个.catch(err => {console.error(err)})将捕获数据库,集合和游标级别的错误。
  • 使用jQuery,考虑使用.done(result => {...}).fail(err => { ... }) (又名promises),而不是为你的ajax调用complete ,不pipe你做什么,都不要忘记附加一个error handling程序。 (我甚至不确定'完整'是正确的属性,可能取决于你正在使用的jQuery)
  • 如果你正在做一个AJAX POST你应该附加一些data (和一个dataType )。 否则,你仍然没有logging,因为req.body将是未定义的或空的。
  • 在出现错误的情况下,您应该使用res.status(500); res.end()进行响应res.status(500); res.end() res.status(500); res.end()至less可以告诉服务器端什么时候出错了。
  • 为了帮助,在你的函数顶部的console.log(req.body) ,以便你知道什么数据到达。
  • 最后,如果你打算用JSON响应 – 使用res.json(doc)而不是res.send(doc)