我尝试了很多东西,我无法弄清楚我做错了什么。我是后端服务的新手,不知道从哪里开始寻找问题。
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 :(得分: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")
给它一个名字,并在你使用它的任何地方引用它,或者读你的代码的人不知道任何变量代表什么。