2015-09-07 51 views
0

我试过多种东西,我无法弄清楚我做错了什么。我是后端服务新手,不确定从哪里开始寻找问题。MongoDB和快速呼叫不工作

app.js

// SERVER SETUP 

    var express = require ('express'); 
    var bodyParser = require ('body-parser'); 
    var app = express(); 
    var router = express.Router(); 
    var routes = require('./routes'); 
    var transactions = require('./routes/routes'); 

    app.use(bodyParser.urlencoded({ extended: true})); 
    app.use(bodyParser.json()); 

    var port = process.env.PORT || 8080; 

//API ROUTES 

    router.use(function (req, res, next){ 
     console.log('Something is happening. . .'); 
     next(); 
     }); 

// REGISTER ROUTES 
    app.use('/', router); 

    app.get('/transactions', transactions.getRecords); 

// START THE SERVER 
    app.listen(port); 
    console.log('Server is running on port ' + port); 

model.js

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 

var db = mongoose.connection; 

db.on('error', console.error); 
db.once('open', function (callback){ 
    console.log('Mongo Connected'); 
    }); 

var Schema = mongoose.Schema; 

var BankSchema = new Schema({ 
    _id: String, 
    date: Date, 
    account: String, 
    location: String, 
    amount: Number, 
    type: String, 
    reason: { 
     type: String, 
     explanation: String 
    } 
    }); 

exports.transactions = mongoose.model('BudgetApp', BankSchema, 'transactions'); 

routes.js

var useModel = require('./model'); 

var bankData = useModel.transactions; 

var transactions = function (callback){ 
    var records = [] 

    bankData.aggregate([ 

      {$match: {type:"debit"} }, 

      {$group:{ 
       _id:{ 
        month: {$month: "$date"}, 
        year:{$year: "$date"} 
       }, 
      expense: { 
       $sum:"$amount" 
       } 
      } 
     }, 
     {$project: { 
      date: "$_id", 
      spent: "$expense" 
     }} 
    ], function (err, data){ 
     if (err){ console.log(err);} 
      console.log(data); 
      records.push(data); 
     }); 

    callback(records); 
};//transactions 

exports.getRecords = function (req, res){ 
    transactions(function (err, transaction){ 
     if (err){console.log(err);} 
     res.json(transaction); 
    }); 
}; 

当运行节点服务器,控制台日志仅回报和空数组,没有错误。我不知道我做错了什么。

+0

你已经提到了localhost。但你配置了本地主机url的端口?如果没有,那么尝试把你的mongo服务器运行的端口号。请让我知道它是否有帮助。 :) – Abhishek

+0

我甚至不确定我的URL是否正确或者如何为mongodb设置url – Obsanity

+0

如果您刚刚在他们的教程中安装了Mongo数据库,那么只需将“mongoose.connect('mongodb:// localhost/test')“与”mongoose.connect('mongodb:// localhost:27017/test')“。试试看,让我知道。 – Abhishek

回答

0

您的事务函数中的回调需要在聚合查询的回调中执行。由于查询是异步的,因此callback(records)将在查询完成之前执行,并将空数组传递给回调函数。另外,回调函数正在寻找两个参数:一个错误和一个数组。如果你没有错误,你想要做callback(null, records)。在你当前的代码中,你将记录传递给错误参数,它只会被记录下来(这就是你看到一个空数组的原因)。

除此之外,您的records变量是多余的。您从汇总中收到的数据是您拥有的唯一数据。本次交易功能可以简化为:

var transactions = function (callback){ 

    bankData.aggregate([ 
     {$match: ... }, 
     {$group: ... }, 
     {$project: ... } 
    ], callback); 
}; 

顺便说一句代码质量,这条线是痛苦阅读:

exports.transactions = mongoose.model('BudgetApp', BankSchema, 'transactions');

在两个文件中,你提到了相同的数据as BudgetAppBankSchemaBankData。 保持一致。现在,它被保存在蒙戈集合下交易,所以命名为认为:

​​

给它一个名字,并把它称为是无处不在,你使用它,或者有人读你的代码不会有任何知道任何变量代表什么。

+0

我做了建议的更改,但现在变得 “错误:参数必须是聚合管道操作员”。 – Obsanity

+0

这听起来像是缺少关闭/打开'{}'的语法错误。这意味着你对match/group/project之一使用了错误的$操作符 – cdbajorin