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

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=

我是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= 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
  • 在尝试迭代光标之前,您应该检查
    err
    ,查看mongo是否返回错误
编辑:

更具体地说,整个块应该如下所示:

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()
    已被弃用,取而代之的是
    cursor.forEach()
    假设您正在运行最新版本的mongo
  • 回调中的第一行应该类似于
    if(err){console.error(err)}
    ——此时您可能会看到查询无效:
  • 您的查询可能看起来像
    .find({'name1':t.text,'name2':1,'u id':0})
  • 如果将自动生成的mongo ObjectID引用为
    \u id
    ,则必须使用
    “u id”:new mongo.ObjectID()
    ,才能使其正常工作。如果在创建时未指定
    \u id
    ,则自动生成的ObjectID将需要此id
  • 这些都很好,强烈建议翻阅它们以获取示例,哪些位采用哪些参数,以及所有这些参数的选项
  • 考虑使用承诺而不是回访来帮助整理。mongo真的很简单-您只需不指定回调函数,而是在末尾添加一个
    ,然后(document=>{…})
    ,一个
    .catch(err=>{console.error(err)})
    将捕获数据库、集合和光标级别的错误
  • 使用jQuery,考虑使用<代码>。完成(结果= > {…})<代码> >代码> >失败(Err= {{…})< /代码>(又名承诺),而不是< Acjax调用>代码>完整< /代码>,并且无论您做什么,请不要忘记附加错误处理程序。(我甚至不确定“complete”是正确的属性,这可能取决于您使用的jQuery)
  • 如果您正在执行AJAX
    POST
    ,您可能应该在其上附加一些
    数据(以及
    数据类型)。否则,您仍然不会得到任何记录,因为
    req.body
    将未定义或为空
  • 如果出现错误,您应该使用
    res.status(500)进行响应;res.end()
    ,这样您就可以知道服务器端何时出了问题
  • 为了帮助您进行操作,
    console.log(req.body)
    位于函数顶部,这样您就可以知道到达的数据
  • 最后,如果您打算使用JSON进行响应,请使用
    res.JSON(doc)
    而不是
    res.send(doc)

感谢上面提到的几点,但仍然会出现相同的错误,因为“doc”不在范围内,还有其他方法吗?@jaidepsingh您的文档是否正在打印到控制台?是的,它正在打印到控制台上?尝试使用更新的代码,仍然无法处理错误-看一看:,在index.js上显示“未找到”抱歉--您面临的问题是。每个呼叫都没有退出。我用findOne()示例更新了我的答案。