繁体   English   中英

如何将代码从server.js中抽象到Express应用程序的子目录中?

[英]How can I abstract code out of server.js into subdirectories in my Express app?

我是Node的新手,我正在尝试使用Express和MongoDB为正在构建的Web应用程序构建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文件中? 还是模式应该位于自己的目录中?

我可能已经知道了。 似乎可行,但我想确认这确实是正确的方法。 这种结构是否能让我轻松添加新模型和路线? 我认为这只是意味着我需要不断将appmongoose传递给我的模型和路线。

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

车型/ user.js的

module.exports = function(mongoose) {

    var userSchema = new mongoose.Schema({
        email: {
            type: String,
        },
        password: {
            type: String,
        }
    });

    return mongoose.model('user', userSchema);
};

路线/ 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目录中的文件中。 这绝不是典型/完美/或理想。 这只是我个人的喜好。

现在,就实际文件而言,您拥有的实际上已经很接近了,但是您应该避免将appmongoose对象传递给其他模块。 每个模块应尽可能与应用程序的其余部分隔离。 如果您的模型需要獴根本require ,而不是通过它的猫鼬模块,在路线,你会利用快递路由器,然后导出从路由模块的路由器,那么你就需要和使用路由模块中的应用。

例:

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

...

控制器/ 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');
    });
} 

...

车型/ user.js的

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var UserSchema   = new Schema({
    name: String
});

module.exports = mongoose.model('User', UserSchema);

注意:我对Mongo / Mongoose不太熟悉,因为已经有一段时间了,因为我在项目中使用过它们中的任何一个,所以语法可能有点不正确。 上面的示例仅用于说明目的,尚未经过测试或调试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM