javascript - express promise 链错误

标签 javascript mongodb rest api express

我编写了一个简单的express.js 服务器,用于处理 REST API 请求并从 MongoDB 数据库获取数据。当我向特定端点(“localhost:8081/api/getUserData”)发出 GET 请求时, promise 链无法按照我希望的方式工作,而且我仍然不明白。

这是我得到的错误: “[TypeError:无法读取未定义的属性'db']”

var MongoClient = require('mongodb').MongoClient;
var express = require('express');
var app = express();
var rp = require("request-promise");
var cors = require('cors');

// use it before all route definitions
app.use(cors({ origin: '*' }));

/********************** REST API FUNCTIONS **********************/
app.get('/api/getUserData', function (req, res, next) {
  var context = {};
  console.log("in api getUserData")
  context.db_url = 'mongodb://localhost:27017/test';
  openDatabaseConnection(context)
    .then(getAllUserLocations)
    .then(closeDatabaseConnection)
    .then(function (context) {
      res.send(context.userLocations)
    })
    .catch(function (error) {
      console.log("ERROR :");
      console.log(error);
    })
})
/********************** END REST API FUNCTIONS **********************/

function getAllUserLocations(context) {
  context.db.collection("test").find().toArray().then(function (err, result) {
    console.log("Received from db: " + result.length + " objects");
    context.userLocations = result;
    return context;
  });
}

function openDatabaseConnection(context) {
  console.log("Opening DB connection...");
  return MongoClient.connect(context.db_url)
    .then(function (db) {
      console.log("DB connection opened.");
      context.db = db;
      return context;
    })
}

function closeDatabaseConnection(context) {
  console.log("Closing DB connection");
  return context.db.close()
    .then(function () {
      console.log("DB connection closed");
      return context;
    })
}

/********************** STARTING SERVER **********************/
var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("Githex server listening at http://%s:%s", host, port)
})

任何帮助将不胜感激,甚至更多的解释,因为我不明白我做错了什么。

谢谢!

最佳答案

就像@adeneo 在第一条评论中提到的那样,您缺少 db 属性。看看你的第一个函数:

app.get('/api/getUserData', function (req, res, next) {
  var context = {};
  console.log("in api getUserData")
  context.db_url = 'mongodb://localhost:27017/test';
  openDatabaseConnection(context)
    .then(getAllUserLocations)
    .then(closeDatabaseConnection)
    .then(function (context) {
      res.send(context.userLocations)
    })
    .catch(function (error) {
      console.log("ERROR :");
      console.log(error);
    })
});

现在浏览一下这个函数中的各行:

  1. 您将上下文设置为空对象
  2. 您已将 db_url 属性添加到对象上,到目前为止您已拥有

    context = {db_url: "mongodb://localhost:27017/test}
    
  3. 将上下文对象传递到 openDatabaseConnection 函数
  4. 在 openDatabaseConnection 函数中,您返回一个上下文对象。这个新返回的对象不会在任何地方设置,它只是被返回并且从未被使用。您想要使用该返回值调用 getuserlocation() 函数。

所以不要只是打电话

.then(getAllUserConnection)

我愿意

.then(function(context){getAllUserConnection(context);})

这应该利用返回的值并确保您正在使用它。

关于javascript - express promise 链错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40184447/

相关文章:

javascript - Vue.js 不显示任何内容

javascript - 表标题上的蒲公英数据表复选框

javascript - 如何用JS中的替代方法替换这段代码中html中的onClick()方法?

javascript - mongodb:带有 $in 运算符的 collection.find 不会返回任何内容

javascript - 如何更改 Meteor.users _id?

java - 到子资源的 REST 映射

java - MongoDB 和 Spring MVC : PATCH operation?

javascript - Lambda 和 Cloudfront URL 重写

java - Put 请求上的 HTTP 403 Forbidden Jersey

node.js - 如果第三个键为 true,则比较 mongodb 文档的两个键