API 使用 express 和 mongoskin 驱动程序从 mongoDB 获取所有记录

API that fetches all records from mongoDB using express and mongoskin driver

我是 Mean 堆栈的初学者 我正在开发一个 API,它使用 express 从 mongodb 中获取所有记录。但是我无法从数据库中获取所有记录。我不知道我做错了什么,我是这样做的:

这是我的主要应用程序 (server.js)

require('rootpath')();
var express = require('express');
var app = express();
var session = require('express-session');
var bodyParser = require('body-parser');
var expressJwt = require('express-jwt');
var config = require('config.json');

app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(bodyParser.json());
app.use(session({
  secret: config.secret,
  resave: false,
  saveUninitialized: true
}));

// use JWT auth to secure the api
app.use('/api', expressJwt({
  secret: config.secret
}).unless({
  path: ['/api/users/authenticate', '/api/users/register']
}));

// routes
app.use('/', require('./controllers/login.controller'));
app.use('/register', require('./controllers/register.controller'));
app.use('/app', require('./controllers/app.controller'));
app.use('/api/users', require('./controllers/api/users.controller'));

/*// make '/app' default route
app.get('/', function (req, res) {
    return res.redirect('/app');
});*/

// start server
var server = app.listen(3000, function() {
  console.log('Server listening at http://' + server.address().address + ':' + server.address().port);
});

这是我的 user.controller.js 用户将向 api 提出请求 http://localhost:3000/api/users/userList

var express = require('express');
var router = express.Router();
var userService = require('services/user.service');

router.get('/userList', getUserList);

module.exports = router;

function getUserList(req, res) {
  userService.userList()
    .then(function(users) {
      if (users) {
        res.send(users);
      } else {
        res.sendStatus(404);
      }
    })
    .catch(function(err) {
      res.status(400).send(err);
    });
}

这是我的 user.service.js 查询数据库以使用 mongoskin 驱动程序获取所有记录的地方。

var Q = require('q');
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/EmployeeForm", {
  native_parser: true
});
db.bind('users');

var service = {};

service.userList = userList;

module.exports = service;

function userList() {
  var deferred = q.defer();

  db.users.find(function(err, users) {
    if (err) deferred.reject(err.name + ': ' + err.message);

  });

  return deferred.promise;
}

所以我认为这是发现问题。

MongoDB 默认查找方法 return 游标。 https://docs.mongodb.com/manual/reference/method/db.collection.find/

https://github.com/kissjs/node-mongoskin 他们使用方法 toArray 将光标转换为这样的对象数组 db.find.toArray(callback)

所以在 userList() 中这样尝试

function userList() {
  var deferred = q.defer();

  db.users.find({}).toArray(function(err,docs){
     err ? deferred.reject(err) :  deferred.resolve(docs);
  });

  return deferred.promise;
}

希望这对您有所帮助。