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

时间:2016-11-16 19:02:59

标签: javascript json node.js mongodb express

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

2 个答案:

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

另请注意:

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

答案 1 :(得分:0)

一些事情:

    假设您正在运行最近版本的mongo,
  • cursor.each()已被弃用,而不是cursor.forEach()
  • 回调中的第一行应该是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>)才能使其正常工作。如果您在创建时未指定_id,则自动生成的ObjectID将需要此项。
  • mongo docs很棒,强烈推荐翻阅它们以获取示例,以及哪些参数和所有参数的选项。
  • 考虑使用promises而不是回调来帮助整理。使用mongo非常简单 - 你只是不指定回调函数,而是在最后添加.then(document => { ... }),而单个.catch(err => {console.error(err)})将捕获db,collection和cursor级别的错误。< / LI>
  • 使用jQuery,考虑使用.done(result => {...}).fail(err => { ... })(又名承诺)代替complete进行ajax调用,不管你做什么,都不要忘记附加错误处理程序。 (我甚至不确定'完整'是正确的属性,可能取决于你正在使用的jQuery)
  • 如果你正在做一个AJAX POST,你应该附上一些data(以及一个dataType)。否则你仍然没有记录,因为req.body将是未定义或为空。
  • 如果出现错误,您应该至少以res.status(500); res.end()回复,这样您就可以知道服务器端出现问题的时间。
  • 为了提供帮助,console.log(req.body)就在您的功能顶部,以便您了解到达的数据。
  • 最后,如果您打算使用JSON进行回复 - 请使用res.json(doc)代替res.send(doc)