Javascript Node.js REST API从MongoDB获取数据
我正在尝试使用Node.js创建一个RESTAPI,它将获取MongoDB集合的最后N行。这是我当前的代码:Javascript Node.js REST API从MongoDB获取数据,javascript,node.js,mongodb,rest,Javascript,Node.js,Mongodb,Rest,我正在尝试使用Node.js创建一个RESTAPI,它将获取MongoDB集合的最后N行。这是我当前的代码: var express = require("express"); var app = express(); var bodyParser = require("body-parser"); var router = express.Router(); var mongodb = require("mongodb"); var Mong
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的情况)。我调查了猫鼬,这看起来相当可靠,但就我而言,我已经有了一个预先存在的数据库和集合,所以不确定这是否是完成此任务的最佳途径
如果您需要更多信息或澄清,请随时告诉我!谢谢你的阅读 您将使用
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条记录,可以使用排序
和限制
的组合。首先,按升序/降序对特定字段(如日期)进行排序,然后将结果限制为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);
最终解决了我的问题。将我的get语句更改为:
router.get("/", function(req, res, next) {
db.collection("samplecollection", function(err, collection){
collection.find({}).limit(10).toArray(function(err, data){
res.json(data);
})
});
});
这不应该出现在if(doc)声明中吗?那不是else声明吗?是的,对不起。我已经更新了答案,也包括了我将如何获得最后的N条记录。所以我更新了我的初始帖子,包括了我之前是如何尝试限制的,但它似乎不起作用。它似乎遵循了您在文章中提到的格式。因此,这段代码在某种程度上是有效的,但是,在发送第一个JSON对象之后,我遇到了一个错误:发送后无法设置头。这在
res.send(响应)上代码>行。我正在处理。我有一个本地测试服务器设置,以了解发生了什么。我回家后会发帖子,再测试一点。我敢打赌,这件事很简单