2011-12-14 5 views
1

J'écris cette mini application RESTful qui prend des demandes à différentes URL. Pour cela, j'utilise nodejs, et j'exprime pour configurer les différents chemins. En tant que base de données, je prévois d'utiliser monogoDB (le node-mongodb-native de christkv).Application NodeJS avec express et mongoDB

Mon code (qui ne comprend pas les tentatives de mongo) ressemble à ceci:

app.js

/** 
* Module dependencies. 
*/ 
var express = require('express') 
    , routes = require('./routes') 
var app = module.exports = express.createServer(); 

var Db = require('mongodb').Db; 
var Server = require('mongodb').Server; 
var client = new Db('test', new Server('127.0.0.1', 27017, {}));  

// Configuration 

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function() { 
    app.use(express.errorHandler()); 
}); 

var insertData = function(err, collection) { 
    collection.insert({name: "Kristiono Setyadi"}); 
    collection.insert({name: "Meghan Gill"}); 
    collection.insert({name: "Spiderman"}); 
} 



// Routes 
app.post('/', routes.syncServiceIndex); 

app.post('/syncService', routes.synchServicePost); 
app.get('/syncService/:syncServiceUser/sync', routes.synchServiceSync); 
app.post('/syncService/:syncServiceUser/push', routes.synchServicePush); 
app.del('/syncService/:syncServiceUser', routes.synchServiceDel); 

app.post('/syncService/:syncServiceUser/contacts/push', routes.synchServiceContactsPush); 
app.get('/syncService/:syncServiceUser/contacts/sync', routes.synchServiceContactsSync); 

app.post('/syncService/:syncServiceUser/contacts/', routes.synchServiceContactsPost); 
app.get('/syncService/:syncServiceUser/contacts/:contactId', routes.synchServiceContactsGet); 
app.put('/syncService/:syncServiceUser/contacts/:contactId', routes.synchServiceContactsPut); 
app.del('/syncService/:syncServiceUser/contacts/:contactId', routes.synchServiceContactsDel); 

app.listen(3000); 



console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); 

et pour le bien de garder différents composants dans des fichiers différents, ceci est mon fichier le code pour chaque URL:

index.js

//var ObjectID = db.bson_serializer.ObjectID; 
exports.syncServiceIndex = function(req, res) { 
    console.log('syncServiceIndex'); 
    //console.log("BODY:" + JSON.stringify(req.body)); 

    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServicePost = function(req, res) { 
    console.log('synchServicePost'); 
    console.log("BODY:" + JSON.stringify(req.body)); 
    var jsonObject = JSON.parse(JSON.stringify(req.body)); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceSync = function(req, res) { 
    console.log('synchServiceSync'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServicePush = function(req, res) { 
    console.log('synchServicePush'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceDel = function(req, res) { 
    console.log('synchServiceDel'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceDel = function(req, res) { 
    console.log('synchServiceDel'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceContactsPush = function(req, res) { 
    console.log('synchServiceContactsPush'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceContactsSync = function(req, res) { 
    console.log('synchServiceContactsSync'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceContactsPost = function(req, res) { 
    console.log('synchServiceContactsPost'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceContactsGet = function(req, res) { 
    console.log('synchServiceContactsGet'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceContactsPut = function(req, res) { 
    console.log('synchServiceContactsPut'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

exports.synchServiceContactsDel = function(req, res) { 
    console.log('synchServiceContactsDel'); 
    res.statusCode = 200; 
    res.send("OK\n"); 
}; 

d'après ce que je vu dans certains exemples de codes que j'ai été vérifier, je ne devrais vraiment utiliser une seule connexion ouverte, qui est que je devrais avoir tout mon code dans le

client.open(function(err, pClient) { 

}); 

appel. Le problème que je rencontre est que je ne sais pas comment passer le client ou la collection pour pouvoir travailler avec la base de données du fichier index.js. Y a-t-il un moyen de le faire dans la mise en page actuelle ou dois-je déplacer certaines choses?

Répondre

1

Vous pouvez envelopper tous vos itinéraires dans le rappel et définir req.mongoClient = pClient dans un middleware, par exemple:

client.open(function(err, pClient) { 
    clientMiddleware = function (req, res, next) { 
    req.mongoClient = pClient; 
    next(); 
    } 
    // your routes here, with clientMiddleware 
    app.post('/', clientMiddleware, routes.syncServiceIndex); 
    app.post('/syncService', clientMiddleware, routes.synchServicePost); 
    app.get('/syncService/:syncServiceUser/sync', clientMiddleware, routes.synchServiceSync); 
    // etc. 
}); 

Vous pouvez maintenant obtenir le client en utilisant req.mongoClient dans toutes les routes.

+0

Pourquoi devrait-on encapsuler des routes dans le rappel client.open? Dois-je faire cela si j'utilise mongoskin aussi? – georgesamper

+0

Eh bien, vous le feriez si vous voulez que mongoClient soit facilement accessible dans les routes/contrôleur. Vous n'avez pas besoin de faire cela, c'est une question de préférence. – alessioalex

+0

Oh je vois. Merci :) – georgesamper