MongoDB和快速呼叫无法正常工作

时间:2015-09-07 13:29:50

标签: node.js mongodb express

我尝试了很多东西,我无法弄清楚我做错了什么。我是后端服务的新手,不知道从哪里开始寻找问题。

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);
    });
};

当我运行节点服务器时,控制台日志只返回并清空数组,没有错误。我不知道我做错了什么。

1 个答案:

答案 0 :(得分:0)

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

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

var transactions = function (callback){

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

作为代码质量的一小部分,这条线很难阅读:

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

在两个文件中,您引用的数据与 BudgetApp BankSchema 交易 BankData 。 始终如一。现在,它被保存在mongo集合事务下,因此将其命名为:

// model.js (you could even name it transaction.js)
module.exports = mongoose.model("Transaction", TransactionSchema)
// routes.js
var Transaction = require("./model")

给它一个名字,并在你使用它的任何地方引用它,或者读你的代码的人不知道任何变量代表什么。