如何将 server.js 中的代码提取到我的 Express 应用程序的子目录中?
How can I abstract code out of server.js into subdirectories in my Express app?
我是 Node 的新手,我正在尝试使用 Express 和 MongoDB 构建一个 API 作为我正在构建的网络应用程序。我正在学习一些教程并且我有一些基本的工作路线,但现在我的所有代码都在一个文件中,server.js。我想将其中一些移到子目录中以更好地组织代码。我该怎么做?
var express = require('express'),
mongoose = require('mongoose'),
app = express();
var userSchema = new mongoose.Schema({
email: {
type: String
},
password: {
type: String
}
});
var UserModel = mongoose.model('user', userSchema);
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
next();
});
mongoose.connect('mongodb://localhost/mymongocollection');
app.get('/user', function(req,res) {
// do something
});
app.post('/user', function(req,res) {
// do something
});
app.listen('4500');
我认为这是有道理的:
- server.js
- routes/
- user.js
- models/
- user.js
在 server.js
中,我似乎要使用 require()
?
var userModel = require('models/user.js);
我已经在 Node 和 module.exports
中阅读了有关 module
的内容,但我还没有真正了解它。它是如何工作的?
最后,用户模式应该放在 models/user.js
文件中吗?还是模式应该存在于它们自己的目录中?
我可能已经明白了。它似乎有效,但我想确认这确实是正确的方法。这种结构是否允许我轻松添加新模型和路线?我认为这只是意味着我需要不断地将 app
和 mongoose
传递给我的模型和路线。
server.js
var express = require('express'),
mongoose = require('mongoose'),
app = express();
// set headers
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
next();
});
// connect
mongoose.connect('mongodb://localhost/mymongocollection');
// models
var UserModel = require('./models/user.js')(mongoose);
// routes
var userRoutes = require('./routes/user.js')(app, UserModel);
// listener
app.listen('4500');
models/user.js
module.exports = function(mongoose) {
var userSchema = new mongoose.Schema({
email: {
type: String,
},
password: {
type: String,
}
});
return mongoose.model('user', userSchema);
};
routes/user.js
module.exports = function(app, UserModel) {
app.get('/user', function(req,res) {
// do something
});
app.post('/user', function(req,res) {
// do something
});
};
构建节点应用程序确实没有正确或错误的方法,只要它有效即可。这在很大程度上取决于个人喜好。话虽这么说,但有一些约定俗成,经常被用来帮助保持事情井井有条和理智。
构建应用程序的两种主要方式是根据模块类型(路线、模型等)或功能(用户、产品等)分离文件
示例方法 1
+ app
+ routes
- user.js
- product.js
+ models
- user.js
- product.js
- config.js
- server.js
示例方法 2
+ app
+ user
- model.js
- route.js
+ product
- model.js
- route.js
- config.js
- server.js
就我个人而言,我的设置通常类似于:
+ app
+ controllers
- user.js
- product.js
+ models
- user.js
- product.js
+ templates
- user.html
- product.html
+ utils
- some_cool_thing.js
- config.js
- router.js
- server.js
我有一个大 router.js
,它包含整个应用程序的路由,而不是为每个功能分解路由。每个路由的所有逻辑都包含在 controllers
目录中的一个文件中。这绝不是典型的/完美的/或理想的。这只是我个人的喜好。
现在就实际文件而言,您所拥有的非常接近,但您应该尽量避免将 app
或 mongoose
对象传递给其他模块。每个模块应尽可能与应用程序的其余部分隔离。如果您的模型只需要 mongoose require
mongoose 模块而不是传入它。在路由中,您可以使用 express 路由器,然后从路由模块导出路由器,然后您需要并使用应用程序中的路由模块。
示例:
server.js
var express = require('express'),
mongoose = require('mongoose'),
router = require('./router'), // this is your router.js file
app = express();
// connect
mongoose.connect('mongodb://localhost/mymongocollection');
// routes
app.use('/', router); // use your routes on the root of the application
// app.use('/api', router); // you could easily use your routes prefixed with `/api`
// listener
app.listen('4500');
router.js
var router = require('express').Router(); // https://expressjs.com/en/4x/api.html#router
// controllers
var Users = require('./controllers/user.js');
var Products = require('./controllers/products.js');
// routes
router.route('/user')
.get(Users.findAll)
.post(Users.create);
router.route('/users/:id')
.get(Users.findOne)
.put(Users.update)
.delete(Users.remove);
...
controllers/user.js
var UserModel = require('../models/user.js');
exports.findAll = function(req, res, next) {
UserModel.find(function(err, users) {
if (err) return next(err);
res.send(users);
}
}
exports.create = function(req, res, next) {
var user = new UserModel();
user.name = req.body.name;
user.save(function(err) {
if (err) return next(err);
res.send('user created');
});
}
...
models/user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String
});
module.exports = mongoose.model('User', UserSchema);
注:
我对 Mongo / Mongoose 不是很熟悉,因为我已经有一段时间没有在项目中使用过它们了,所以语法可能有点不对劲。以上示例更多的是为了说明目的,它们还没有经过测试或调试。
我是 Node 的新手,我正在尝试使用 Express 和 MongoDB 构建一个 API 作为我正在构建的网络应用程序。我正在学习一些教程并且我有一些基本的工作路线,但现在我的所有代码都在一个文件中,server.js。我想将其中一些移到子目录中以更好地组织代码。我该怎么做?
var express = require('express'),
mongoose = require('mongoose'),
app = express();
var userSchema = new mongoose.Schema({
email: {
type: String
},
password: {
type: String
}
});
var UserModel = mongoose.model('user', userSchema);
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
next();
});
mongoose.connect('mongodb://localhost/mymongocollection');
app.get('/user', function(req,res) {
// do something
});
app.post('/user', function(req,res) {
// do something
});
app.listen('4500');
我认为这是有道理的:
- server.js
- routes/
- user.js
- models/
- user.js
在 server.js
中,我似乎要使用 require()
?
var userModel = require('models/user.js);
我已经在 Node 和 module.exports
中阅读了有关 module
的内容,但我还没有真正了解它。它是如何工作的?
最后,用户模式应该放在 models/user.js
文件中吗?还是模式应该存在于它们自己的目录中?
我可能已经明白了。它似乎有效,但我想确认这确实是正确的方法。这种结构是否允许我轻松添加新模型和路线?我认为这只是意味着我需要不断地将 app
和 mongoose
传递给我的模型和路线。
server.js
var express = require('express'),
mongoose = require('mongoose'),
app = express();
// set headers
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
next();
});
// connect
mongoose.connect('mongodb://localhost/mymongocollection');
// models
var UserModel = require('./models/user.js')(mongoose);
// routes
var userRoutes = require('./routes/user.js')(app, UserModel);
// listener
app.listen('4500');
models/user.js
module.exports = function(mongoose) {
var userSchema = new mongoose.Schema({
email: {
type: String,
},
password: {
type: String,
}
});
return mongoose.model('user', userSchema);
};
routes/user.js
module.exports = function(app, UserModel) {
app.get('/user', function(req,res) {
// do something
});
app.post('/user', function(req,res) {
// do something
});
};
构建节点应用程序确实没有正确或错误的方法,只要它有效即可。这在很大程度上取决于个人喜好。话虽这么说,但有一些约定俗成,经常被用来帮助保持事情井井有条和理智。
构建应用程序的两种主要方式是根据模块类型(路线、模型等)或功能(用户、产品等)分离文件
示例方法 1
+ app
+ routes
- user.js
- product.js
+ models
- user.js
- product.js
- config.js
- server.js
示例方法 2
+ app
+ user
- model.js
- route.js
+ product
- model.js
- route.js
- config.js
- server.js
就我个人而言,我的设置通常类似于:
+ app
+ controllers
- user.js
- product.js
+ models
- user.js
- product.js
+ templates
- user.html
- product.html
+ utils
- some_cool_thing.js
- config.js
- router.js
- server.js
我有一个大 router.js
,它包含整个应用程序的路由,而不是为每个功能分解路由。每个路由的所有逻辑都包含在 controllers
目录中的一个文件中。这绝不是典型的/完美的/或理想的。这只是我个人的喜好。
现在就实际文件而言,您所拥有的非常接近,但您应该尽量避免将 app
或 mongoose
对象传递给其他模块。每个模块应尽可能与应用程序的其余部分隔离。如果您的模型只需要 mongoose require
mongoose 模块而不是传入它。在路由中,您可以使用 express 路由器,然后从路由模块导出路由器,然后您需要并使用应用程序中的路由模块。
示例:
server.js
var express = require('express'),
mongoose = require('mongoose'),
router = require('./router'), // this is your router.js file
app = express();
// connect
mongoose.connect('mongodb://localhost/mymongocollection');
// routes
app.use('/', router); // use your routes on the root of the application
// app.use('/api', router); // you could easily use your routes prefixed with `/api`
// listener
app.listen('4500');
router.js
var router = require('express').Router(); // https://expressjs.com/en/4x/api.html#router
// controllers
var Users = require('./controllers/user.js');
var Products = require('./controllers/products.js');
// routes
router.route('/user')
.get(Users.findAll)
.post(Users.create);
router.route('/users/:id')
.get(Users.findOne)
.put(Users.update)
.delete(Users.remove);
...
controllers/user.js
var UserModel = require('../models/user.js');
exports.findAll = function(req, res, next) {
UserModel.find(function(err, users) {
if (err) return next(err);
res.send(users);
}
}
exports.create = function(req, res, next) {
var user = new UserModel();
user.name = req.body.name;
user.save(function(err) {
if (err) return next(err);
res.send('user created');
});
}
...
models/user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String
});
module.exports = mongoose.model('User', UserSchema);
注: 我对 Mongo / Mongoose 不是很熟悉,因为我已经有一段时间没有在项目中使用过它们了,所以语法可能有点不对劲。以上示例更多的是为了说明目的,它们还没有经过测试或调试。