Node.js REST API 从 MongoDB 获取数据
Posted
技术标签:
【中文标题】Node.js REST API 从 MongoDB 获取数据【英文标题】:Node.js REST API to fetch data from MongoDB 【发布时间】:2018-03-11 16:54:05 【问题描述】:我正在尝试使用 Node.js 创建一个 REST API,它将获取 MongoDB 集合的最后 N 行。这是我当前的代码:
var express = require("express");
var app = express();
var bodyParser = require("body-parser");
var router = express.Router();
var mongodb = require("mongodb");
var MongoClient = require("mongodb").MongoClient;
var db;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded("extended" : false));
// Initialize connection once
MongoClient.connect("mongodb://localhost:27017/sample", function(err, database)
if(err) return console.error(err);
db = database;
// the Mongo driver recommends starting the server here because most apps *should* fail to start if they have no DB. If yours is the exception, move the server startup elsewhere.
);
// Reuse database object in request handlers
router.get("/", function(req, res, next)
db.collection("samplecollection").find(, function(err, docs)
if(err) return next(err);
docs.each(function(err, doc)
if(doc)
console.log(doc);
else
res.end();
);
).limit(10,function(e,d));
);
app.use('/',router);
app.listen(3000);
console.log("Listening to PORT 3000");
这是在服务器控制台上成功打印出数据库的所有内容(每当客户端发出 get 请求时)。但是,我如何以一种有效的方式将这个 JSON 信息提供给进行 GET 调用的客户端(并且支持客户端可以添加仅获取数据库的最后 N 行的参数 N 的情况)。我研究了 Mongoose,这似乎很可靠,但就我而言,我已经有一个预先存在的数据库和集合,所以不确定这是否是完成这项任务的最佳途径。
如果您需要更多信息或说明,请随时告诉我!谢谢阅读!
【问题讨论】:
【参考方案1】:您可以使用res.send
而不是res.end
并将响应发送回前端。
router.get("/", function(req, res, next)
db.collection("samplecollection").find(, function(err, docs)
if(err) return next(err);
docs.each(function(err, doc)
if(doc)
console.log(doc);
var response =
statusCode: 200,
headers: 'Content-Type': 'application/json' ,
body: JSON.parse(doc)
res.send(response);
);
);
);
要获取集合的最后 N 条记录,您可以使用 sort
和 limit
的组合。首先,按升序/降序对特定字段(例如日期)进行排序,然后将结果限制为 N 。像这样的:
db.collection.find( query ).sort( key: 1 ).limit(N)
更新:
根据我们正在进行的评论对话,以下是我如何成功将数据发送回客户端的示例。这不包括限制或任何花哨的东西。
var express = require('express');
var app = express();
var port = process.env.PORT || 3000;
var db = require('./config/db');
var bodyParser = require('body-parser');
app.use(express.static(__dirname + "/public"));
app.use(bodyParser.json());
app.get('/', function(req, res)
db.find(, function(err, data)
if (err)
console.log(err);
return res.send(500, 'Something Went wrong with Retrieving data');
else
// console.log(data[0]);
res.json(data);
);
);
app.listen(port);
console.log('Server listening on port: ', port);
【讨论】:
这不应该在 if(doc) 语句中吗?那么不是 else 语句? 是的,对不起。我已经更新了答案,还包括我将如何获取最后 N 条记录。 所以我更新了我最初的帖子,包括我之前是如何尝试限制的,但它似乎不起作用。它似乎遵循您在帖子中提到的格式。 所以这段代码有点工作,但是,在第一个 JSON 对象被发送后我得到一个错误:发送后无法设置标题。这是res.send(response);
行。
我正在努力。我有一个本地测试服务器设置来弄清楚发生了什么。我会在回家后发布并进行更多测试。我敢打赌这很简单【参考方案2】:
最终解决了我的问题。将我的 get 语句更改为:
router.get("/", function(req, res, next)
db.collection("samplecollection", function(err, collection)
collection.find().limit(10).toArray(function(err, data)
res.json(data);
)
);
);
【讨论】:
以上是关于Node.js REST API 从 MongoDB 获取数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node.js 服务器为 Next.js 授权 Azure 存储服务 REST API - 从 URL 复制 Blob
nodejs使用Node.js实现REST Client调用REST API
Node.js Lambda 函数从 REST 调用将“响应无效”返回给 Alexa 服务模拟器