如何使用Express和MongoDB从nodejs服务器发送json到客户端js文件
How to send json from nodejs server to client js file using Express and MongoDB
我是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) }
-在这一点上,你可能会看到你的查询是无效的: 你的查询应该看起来像 - 如果你引用一个自动生成的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)
.find({'name1': t.text, 'name2': 1, '_id': 0})
相关文章:
- 在使用客户端脚本时拾取JSON对象
- 使用JavaScript将客户端日期/时间字符串转换为JSON日期/时间串
- 正在寻找从JSON/对象构建DOM客户端的JS库
- 如何为输出Json对象的ajax调用编写客户端脚本
- 将列表<字符串>转换为客户端 ASP.NET MVC 上的 Json 数组
- 将 package.json 用于客户端包,可以在浏览器中动态加载
- 使用 RESTful API,如果未定义特定的响应 json 级别,我如何在客户端不出错
- 客户端将EDN转换为JSON(HTML5应用程序使用的Datomic数据)
- 可以't为客户端形成正确的JSON响应
- node.js+MySQL;JSON结果-回调问题&没有响应客户端
- 如何向客户端返回带有双引号的字符串?脚本将其解析为JSON对象
- 在服务器上压缩JSON消息,在客户端解压缩
- 如何将 JSON 数据从客户端发送到节点.js服务器
- Javascript 客户端框架与 Rails JSON API - 如何进行集成测试
- 客户端通过JS请求JSON并填充Rails视图
- 将变量从客户端发送到服务器 |JSON vs POST
- 对于自动完成,我使用 json 文件作为源.因为它正在客户端下载 json 文件.为了减少数据库命中,我正在尝试这个.这
- 在进行客户端重定向时,是否可以向服务器发送一些JSON
- 规范化与非规范化,当使用带有 JAVA/RDBMS 堆栈的 JSON 客户端时
- JSON:客户端发送的请求在语法上不正确