2015-09-07 4 views
0

J'ai essayé plusieurs choses et je ne peux pas comprendre ce que je fais mal. Je suis nouveau aux services de backend et je ne suis pas sûr où commencer à chercher le problème.MongoDB et appel express ne fonctionne pas

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

Quand je lance le serveur de nœud, le journal de la console uniquement retours et tableau vide, sans erreurs. Je ne sais pas ce que je fais de mal.

+0

Vous avez mentionné le localhost. Mais avez-vous configuré le port avec l'URL localhost? Sinon, essayez de mettre votre numéro de port sur lequel votre serveur mongo est en cours d'exécution. S'il vous plaît laissez-moi savoir si cela a aidé ou non. :) – Abhishek

+0

Je ne suis même pas sûr si j'ai l'url correcte ou comment configurer l'url pour mongodb – Obsanity

+0

Si vous venez d'installer Mongo db suivant leur tutoriel, il suffit de remplacer "mongoose.connect ('mongodb: // localhost/test ') "avec" mongoose.connect (' mongodb: // localhost: 27017/test ') ". Essayez-le et faites le moi savoir. – Abhishek

Répondre

0

Le rappel dans votre fonction de transactions doit être exécuté dans le rappel de la requête agrégée. Comme la requête est asynchrone, callback(records) s'exécutera avant la fin de la requête, en passant un tableau vide au rappel. En outre, le rappel recherche deux paramètres: une erreur et un tableau. Si vous n'avez pas d'erreur, vous voulez faire callback(null, records). Dans votre code actuel, vous passez les enregistrements à l'argument erreur qui sera simplement consolé (c'est pourquoi vous voyez un tableau vide). En outre, votre variable records est redondante. Les données que vous recevez de l'agrégat sont les seules données que vous aurez. La fonction transaction pourrait être simplifiée:

var transactions = function (callback){ 

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

En aparté pour la qualité du code, cette ligne est pénible à lire:

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

Dans deux fichiers, vous avez parlé des mêmes données as BudgetApp, BankSchema, Transactions et BankData. Soyez cohérent. En ce moment, il est en cours d'enregistrement dans la collection mongo transactions, nom si ce que:

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

Donnez-lui un nom, et parler comme que partout où vous l'utiliser, ou une personne lisant votre code n'aurez pas idée de ce que n'importe quelle variable représente.

+0

J'ai apporté les modifications suggérées mais je reçois maintenant "Erreur: Les arguments doivent être des opérateurs agrégés de pipeline". – Obsanity

+0

Cela ressemble à une erreur de syntaxe de fermeture/ouverture manquante '{}'. Cela signifie que vous utilisez un mauvais opérateur $ pour l'un des match/groupe/projet – cdbajorin