我现在已经启动并运行了一些小型Node.js / Express应用程序,但我从未对任何数据库访问解决方案感到满意。
您认为Node.js MVC网络应用程序的数据库访问代码在哪里?
回到ActiveRecord,一切都被原谅了。
答案 0 :(得分:2)
在我看来,这实际上取决于您使用的是哪种数据库。当使用MySQL时,我通常在控制器中使用它们,而在使用MongoDB时,我将它们放入模型中,因为它感觉更自然。老实说,由于NodeJS更像是一个升级的javascript,MVC就是定义。
当通过NPM思考MVC和NodeJS的结构时,可以轻松地考虑将数据库访问转移到新模块中。我对nodeJS中实现数据库访问的方式也不是很满意。
使用Express时虽然我们通常应用RESTful接口并使用路由来填充CRUD操作。我的应用程序从来没有那么大,这样的行为会非常大,但对于大型项目,人们可能想要构建像这样的路径
app.get('/api/item', function(req, res){
//access to your API and do database business
});
通过将它们拆分为名为datbase.js
的数据库访问文件来更合适,更有条理的形式,可以通过
require('./datbase.js').setupDatabase('localhost', port);
例如,这样的数据库管理器可能看起来像
function setupDatabase(address, port) {
//connect to your datbase
//access to your API and do database business
});
}
module.exports.setupDatabase = setupDatabase;
我个人从未尝试过这种方式,但在我看来,这可以帮助您构建更好地访问数据库的方式。希望这有帮助!
修改强> 由于要求CRUD的实现,我发布一个与Mongoose。您可以与正在使用的其他每个数据库进行交换
var application_root = __dirname,
express = require("express"),
path = require("path"),
mongoose = require('mongoose');
var app = express();
mongoose.connect('mongodb://localhost/my_database');
var Item = mongoose.model('Item', new mongoose.Schema({
text: String
}));
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(application_root, "public")));
});
app.get('/', function(req, res){
res.send('Hello World');
});
app.get('/item', function(req, res){
res.render('item', {title: "Your App"});
});
app.get('/api/items', function(req, res){
return Item.find(function(err, items) {
return res.send(items);
});
});
app.get('/api/items/:id', function(req, res){
return Item.findById(req.params.id, function(err, item) {
if (!err) {
return res.send(item);
}
});
});
//etc.
所有这些CRUD操作都适用于您在Backbone应用程序中引入并将其与MongoDB连接的模型。除了MongoDB的一般路径,您还可以使用其他包来创建一个mysql查询,使用NPM并安装nodejs-mysql-native,我发现它有时非常有用。