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

How to send json from nodejs server to client js file using Express and MongoDB

本文关键字:json 客户端 文件 js 服务器 Express 何使用 MongoDB nodejs      更新时间:2023-09-26

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

注意:

    您应该在将数据传递到查询之前对其进行消毒。
  • 你不应该在每个请求都连接到数据库,而是在应用程序上下文中设置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
  • 你在回调中的第一行应该是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文档是伟大的,强烈建议翻阅他们的例子,哪些位采取哪些参数和选项。
  • 考虑使用承诺代替回调来帮助整理。使用mongo真的很容易——你只需要不指定回调函数,而是在最后附加一个.then(document => { ... }),一个.catch(err => {console.error(err)})将捕获db、collection和游标级别的错误。对于jQuery,考虑使用.done(result => {...}).fail(err => { ... }) (aka promises)代替complete来进行ajax调用,无论你做什么,都不要忘记附加一个错误处理程序。(我甚至不确定'complete'是正确的属性,可能取决于你使用的jQuery)
  • 如果你正在做一个AJAX POST你应该可能附加一些data(和一个dataType)到它。否则,您仍然不会得到任何记录,因为req.body将未定义或为空。
  • 在出现错误的情况下,您应该至少使用res.status(500); res.end()响应,以便您可以告诉服务器端何时出现问题。
  • 为了帮助你,console.log(req.body)在你的函数的顶部,这样你就知道什么数据到达了。
  • 最后,如果你打算用JSON响应-使用res.json(doc)而不是res.send(doc)