如何使用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)