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 条记录,您可以使用 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);
  )
);
);

【讨论】:

以上是关于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 服务模拟器

Node.js 通过 REST API 发送图像

使用 node.js 的 Keycloak Rest API

编写 Node.js Rest API 的 10 个最佳实践