【问题标题】:Node.js REST API to fetch data from MongoDBNode.js REST API 从 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,这似乎很可靠,但就我而言,我已经有一个预先存在的数据库和集合,所以不确定这是否是完成这项任务的最佳途径。

如果您需要更多信息或说明,请随时告诉我!谢谢阅读!

【问题讨论】:

    标签: javascript node.js mongodb rest


    【解决方案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 条记录,您可以使用 sortlimit 的组合。首先,按升序/降序对特定字段(例如日期)进行排序,然后将结果限制为 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);
      })
    });
    });
    

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2019-03-12
      • 2016-10-20
      • 2017-05-26
      • 2015-07-05
      • 2015-12-04
      相关资源
      最近更新 更多