Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js REST API从MongoDB获取数据_Javascript_Node.js_Mongodb_Rest - Fatal编程技术网

Javascript Node.js REST API从MongoDB获取数据

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

我正在尝试使用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 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(响应)上行。我正在处理。我有一个本地测试服务器设置,以了解发生了什么。我回家后会发帖子,再测试一点。我敢打赌,这件事很简单