Приложение Cowerplate для создания веб -приложений с использованием Express и Mongoose.
$ git clone https://github.com/wikiyodo/expressjs-boilerplate.git
$ cd expressjs-boilerplate
$ npm install
$ cp .env.example .env
$ npm run start:staging
├── /.data/
├── /app/
│ ├── Http
│ │ ├── Controllers
│ │ ├── Middleware
│ ├── Model
├── /bootstrap/
│ │ ├── boot-configuration.js
│ │ ├── boot-environment.js
│ │ ├── boot-helper-path.js
│ │ ├── boot-router.js
│ │ ├── index.js
│ │ ├── post-index.js
├── /commands/
│ ├── index.js
│ ├── seed.js
├── /database/
│ ├── /schema/
│ │ ├── bank.js
│ │ ├── users.js
│ ├── /seeds/
│ │ ├── bank.js
│ ├── /connection.js
│ └── /all-seeds.js
├── /global/
│ ├── constants.js
│ ├── user-roles.js
├── /helpers/ *
├── /resources/
│ ├── /lang/
│ ├── /view/
├── /routes/
│ ├── /api/
│ │ ├── index.js
│ │ ├── user.js
│ │ ├── guest.js
│ ├── index.js
│ ├── routes-string.js
├── /tests/
├── .env
├── .env.example
├── .gitignore
├── app.js
├── cmd.js
├── package.json
├── package-lock.json
└── Readme.md
Резольвер содержит список модулей, которые могут помочь в различных аспектах.
// how to access the resolver
var resolver = require(process.env.resolver);
Используется для строк маршрута и объекта
resolver.parser(urlSelector, urlParameters, skipBackSlash);
Возвращает строку пути относительно корневого каталога.
resolver.router('database/all-seeds'); // returns __ROOT_DIRECTORY__/database/all-seeds
Возвращает путь к модулю соединения DB.
const resolver = require(process.env.resolver);
var mongoose = require(resolver.connection());
mongoose.model('User', UserSchema);
Возвращает путь к модели, пройденному в виде параметра
const resolver = require(process.env.resolver);
var bankModelPath = pathResolver.model('bank');
const Bank = require(bankModelPath);
Возвращает путь к файлу схемы базы данных, пройденного в виде параметра
const resolver = require(process.env.resolver);
var bankSchemaPath = resolver.dbSchema('bank');
const BankSchema = require(bankSchemaPath);
var Bank = mongoose.model('Bank', BankSchema);
Возвращает путь к файлу контроллера, пройденному в качестве параметра
const resolver = require(process.env.resolver);
var userControllerPath = resolver.controllers('user-controller');
const UserController= require(userControllerPath);
UserController.deleteUser(user_id, (err, response)=>{ });
Возвращает путь к промежуточному файлу, пройденному в виде параметра
const resolver = require(process.env.resolver);
var authMiddlewarePath= resolver.middleware('auth');
const AuthMiddleware= require(authMiddlewarePath);
app.use('/user', AuthMiddleware);
Все маршруты содержатся в Project_Directory /маршрутах и прикреплены /отображаются с базовым маршрутизатором, который содержится в /routes/index.js
var express = require('express');
var router = express.Router();
// this contains all API routes.
var apiRouter = require('./api/index');
// this contains all routes that can be accessed via the web browsers
var webRouter = require('./web/index');
var routeString = require('./routes-string');
module.exports = (app) => {
app.use('/api', apiRouter);
app.use('/', apiRouter);
};
Скажем, вы хотите создать конечную точку API для людей, чтобы получить текущее время сервера в отдельном файле (Time.js, которая будет содержать все конечные точки, относящиеся к времени).
Создать и открыть/routes/api/time.js. тогда контент должен выглядеть так:
var express = require('express');
var router = express.Router();
// endpoint = /api/time/current
router.get('/current'), (req, res)=>{
res.status = 200;
res.send({time:Date.now});
res.end();
});
module.exports = router;
...
const TimeRouter = require('./time'); // this loads the time.js file
...
// use endpoint = /api/time
router.use('/time', TimeRouter );
Динамическая маршрутизация позволяет вам разместить и объявлять все ваши маршруты/пути в файл и вызовать их для использования в любом месте без необходимости переосмысления его. Как только вы измените значение маршрута, он меняется везде, где он используется.
Все маршруты и пути размещены в /routes/routes-string.js
const api = {
user: {
get: '/:id',
roles: {
get: '/all',
},
register: {
':role': {
save: '/save/:userId?'
}
}
},
bank: {
get: '/all'
}
};
const WEB = {
};
module.exports = {
api,
...WEB
};
...
const resolver = require(process.env.resolver);
// the dynamic routing module is place in the resolver and can be accessed resolver.parser
var $ = resolver.parser;
...
// $('api.bank.get', 'api') returns /api/bank/all as path
router.get($('api.bank.get', 'api'), BankController.getAllBanks);
Resolver.parser (Path, Trimindex) используется для анализа индексов маршрута.
Given that our route is -->
{
user: {
get:{
all: '/all'
},
':userId':{
profile: 'profile'
}
}
}
// to formulate user/get/all we will transverse through the index user.get.all
// to formulate user/:userId/profile, transverse through user.:userId.profile
resolver.parser('user.get.all'); // returns /user/get/all
resolver.parser('user.get.all', 'user'); // returns /get/all
resolver.parser('user.get.all', 'user.get'); // returns /all
resolver.parser('user.:userId.profile', {
userId: 3
}); // returns /user/3/profile
Чтобы установить данные о базе данных, открыть /.env -файл и обновить контент следующим образом:
"DATABASE": {
"USERNAME": "YOUR DATABASE USERNAME",
"PASSWORD": "YOUR DATABASE PASSWORD",
"HOST": "YOUR DATABASE HOST e.g localhost",
"PORT": "YOUR DATABASE PORT e.g 27017",
"NAME": "YOUR DATABASE NAME",
"OPTIONS": {} // extra mongoose options
}
Вместо того, чтобы определить всю вашу логику обработки запросов как закрытие в файлах маршрутов, вы можете организовать это поведение с помощью объекта контроллера. Контроллеры могут группировать связанную логику обработки запросов в один объект (источник: https://laravel.com/docs/5.7/controllers). Чтобы создать контроллер, создайте новый файл, например, User-Controller.js In/App/HTTP/Controllers. Типичный контроллер выглядит так;
const resolver = require(process.env.resolver);
const Controller = require('./controller');
var UserController = {};
UserController.getUserRoles = (req, res, next) => {
var returnableRoles = [];
for (var role in Roles)
returnableRoles.push(Roles[role]);
Controller.defaultResponse(res, returnableRoles);
};
module.exports = UserController;
Чтобы получить доступ к вашему контроллеру в любом месте, вы можете легко использовать Resolver.controllers («Имя вашего контроллера»)
...
const resolver = require(process.env.resolver);
const UserController = require(resolver.controllers('user-controller'));
...
router.get('/user/roles', UserController.getUserRoles);
...
Промежуточное программное обеспечение обеспечивает удобный механизм для фильтрации HTTP -запросов, поступающих на ваше заявление. Middlewares хранятся в/app/http/промежуточное программное обеспечение для создания промежуточного программного обеспечения, создайте новый файл, например, auth.js in/app/http/промежуточное программное обеспечение. Типичное промежуточное программное обеспечение выглядит так;
module.exports = (req, res, next) => {
// your logic here
// proceed to next middleware
next();
}
Чтобы получить доступ к вашему промежуточному программному обеспечению в любом месте, вы можете легко использовать Resolver.middleware («Имя своего среднего»)
...
const resolver = require(process.env.resolver);
const AuthMiddleware= require(resolver.middleware('auth'));
...
router.use('/user', AuthMiddleware);
...
Вся схема базы данных для проекта размещена в каталоге /базы данных /схемы. Типичная схема выглядит так:
const resolver = require(process.env.resolver);
var mongoose = require(resolver.connection());
var lastUpdateDate = require('./plugins/last-update');
var Schema = mongoose.Schema;
// sample for a bank schema
var structure = {};
structure.name = String;
structure.code = String;
var bankSchema = new Schema(structure);
bankSchema.plugin(lastUpdateDate);
module.exports = bankSchema;
Этот шаблон включает в себя простой метод посева вашей базы данных с помощью тестовых данных с использованием семян. Все семена базы данных размещены в каталоге /базы данных /семенах.
const pathResolver = require(process.env.resolver);
const Bank= require(pathResolver.model('bank')).Bank;
var getBanks = () => {
return {
"ACCESS BANK": "044",
"ACCESSMOBILE": "323",
"ASO SAVINGS AND LOANS": "401",
"CELLULANT": "317",
"CENTRAL BANK OF NIGERIA": "001",
"CITIBANK": "023",
"CORONATION MERCHANT BANK": "559",
"CORPORETTI": "310",
"COVENANT MICROFINANCE BANK": "551",
"DIAMOND BANK": "063",
"EARTHOLEUM(QIK QIK)": "302",
"ECOBANK NIGERIA": "050",
"ECOMOBILE": "307",
"EKONDO MICROFINANCE BANK": "562",
"ENTERPRISE BANK": "084",
"EQUITORIAL TRUST BANK": "040",
"E - TRANZACT": "306",
"FBN M- MONEY": "309",
"FBN MORTGAGES": "413",
"FETS(MY WALLET)": "314",
"FIDELITY BANK": "070",
"FIDELITY MOBILE": "318",
"FINATRUST MICROFINANCE BANK": "608",
"FIRST BANK OF NIGERIA": "011",
"FIRST CITY MONUMENT BANK": "214",
"FIRST INLAND BANK": "085",
"FORTIS MICROFINANCE BANK": "501",
"FORTIS MOBILE": "308",
"FSDH": "601",
"GT MOBILE MONEY": "315",
"GUARANTY TRUST BANK": "058",
"HEDONMARK": "324",
"HERITAGE BANK": "030",
"IMPERIAL HOMES MORTGAGE BANK": "415",
"INTERCONTINENTAL BANK": "069",
"JAIZ BANK": "301",
"JUBILEE LIFE": "402",
"KEGOW": "303",
"KEYSTONE BANK": "082",
"MAINSTREET BANK": "014",
"MIMONEY(POWERED BY INTELLIFIN)": "330",
"M - KUDI": "313",
"MONETIZE": "312",
"MONEYBOX": "325",
"NEW PRUDENTIAL BANK": "561",
"NPF MFB": "552",
"OCEANIC BANK": "056",
"OMOLUABI SAVINGS AND LOANS": "606",
"ONE FINANCE": "565",
"PAGA": "327",
"PAGE MFBANK": "560",
"PARALLEX": "502",
"PARKWAY(READY CASH)": "311",
"PAYATTITUDE ONLINE": "329",
"PAYCOM": "304",
"PROVIDUS BANK": "101",
"SAFETRUST MORTGAGE BANK": "403",
"SEED CAPITAL MICROFINANCE BANK": "609",
"SKYE BANK": "076",
"STANBIC IBTC BANK": "221",
"STANBIC MOBILE": "304",
"STANDARD CHARTERED BANK": "068",
"STERLING BANK": "232",
"STERLING MOBILE": "326",
"SUNTRUST": "100",
"TEASY MOBILE": "319",
"TRUSTBOND": "523",
"U - MO": "316",
"UNION BANK OF NIGERIA": "032",
"UNITED BANK FOR AFRICA": "033",
"UNITY BANK": "215",
"VFD MICROFINANCE BANK": "566",
"VISUAL ICT": "328",
"VTNETWORK": "320",
"WEMA BANK": "035",
"ZENITH BANK": "057",
"ZENITH MOBILE": "322"
};
};
var locationSeed = () => {
// get all banks
banks = getBanks();
var insertables = [];
for (var name in banks) {
var code = banks[name];
insertables.push({
name,
code
});
}
Bank.insertMany(insertables, (err, docs) => {
if (err) {
console.error(err);
}
});
};
module.exports = locationSeed;
После размещения семян в каталоге семян, вы должны указать его в /датабазе /all-seeds.js, чтобы позволить сеялкам найти его
var SeedBanks= require('./seeds/banks');
var exports = {
SeedBanks,
// place your seeds here
};
module.exports = exports;
Чтобы перенести свои семена, тогда вы используете команду Bellow.
> node cmd run:seed
Это позволяет вам запустить определенные команды в CLI (интерфейс командной строки).
Чтобы создать пользовательскую команду; Создайте файл, который проводит логику в вашу команду в /команды , например, /commands/remove-users.js может содержать приведенный ниже фрагмент
var exports = {};
exports.removeOldUsers = (args) => {
// logic here
};
module.exports = exports;
Затем укажите имя своего команды, а также функцию Callible в /коммандс /index.js
var seeder = require('./seed');
/**
* @info all arguments are to be placed here
*/
const arguments = {
'run:seed': seeder.runSeed,
'your_command': CallableFunction
};
module.exports = arguments;
Это позволяет подтвердить заданное значение против некоторого набора правил.
// Use this to import validation module
var resolver = require(process.env.resolver);
var validator = require(resolver.validator());
Валидации выполняются асинхронно. Validator (array_of_rules, обратный вызов);
validator([
{
fieldName: "name", // name of the field
fieldValue: 2, // the value of the field
validation: 'min:3|max:4', // set of validation rules
errorMessage:"Invalid name" // custom error message for all rules.
}
], (result) => {
res.send(result);
res.end();
});
Разрешенные правила включают:
Это проверяет, что данное значение имеет минимальную длину или значение указанного значения. Например, мин: 2, проверяет, что строка имеет минимальную длину 2 символов, и в случае, если она численная, она проверяет, что заданное число больше или равно 2.
Это проверяет, что данное значение имеет максимальную длину или значение указанного значения. Например, мин: 2, проверяет, что строка имеет максимальную длину 2 символов, и в случае, если она численная, она проверяет, что заданное число меньше или равно 2.
Это проверяет, что данное значение содержит только алфавитные символы и ничего больше.
Это проверяет, что данное значение содержит только альфа -числовые символы и ничего больше.
Это подтверждает, что данное значение представляет собой множество элементов.
Это подтверждает, что заданное значение является десятичным числом
Это подтверждает, что данное значение является действительным электронным письмом.
Это подтверждает, что заданное значение содержит только числовые значения.
Это проверяет, является ли заданное значение действительным номером телефона.
Это проверяет, что заданное значение не является пустым.
Чтобы проверить, не удалась ли проверка
validator(rules, (result) => {
result.failed(); // returns a boolean. true when it fails and false when it doesnt.
result.getFirst('field name'); // returns the first error for the field and undefined in case there is no error
result.getError('field name'); // returns all errors for the field
});
Единидные испытания не были включены в этот шаблон. Тем не менее, вы можете включить его самостоятельно.
Любой и все могут внести свой вклад.
Грань