ExpressおよびMongooseを使用してWebアプリを構築するためのボイラープレートアプリケーション。
$ 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に含まれており、/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);
};
たとえば、人が個別のファイル(時間に関連するすべてのエンドポイントを含むtime.js)で現在のサーバー時間を取得するためのAPIエンドポイントを作成する必要があります。
作成とオープン/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)。コントローラーを作成するには、/app/http/controllers in/app/http/controllers in user-controller.jsなどの新しいファイルを作成します。典型的なコントローラーはこのように見えます。
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;
コントローラーにどこにでもアクセスするには、 slolsver.controllers( 'of-your-controller')を簡単に使用できます。
...
const resolver = require(process.env.resolver);
const UserController = require(resolver.controllers('user-controller'));
...
router.get('/user/roles', UserController.getUserRoles);
...
ミドルウェアは、アプリケーションを入力するHTTP要求をフィルタリングするための便利なメカニズムを提供します。 MiddleWaresは/app/http/ミドルウェアに保存され、ミドルウェアを作成し、新しいファイルを作成します。典型的なミドルウェアはこのように見えます。
module.exports = (req, res, next) => {
// your logic here
// proceed to next middleware
next();
}
どこでもミドルウェアにアクセスするには、 slolsver.middleware( 'name-of-your-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;
種子をSeedsディレクトリに配置した後、 /database /all-seeds.jsで指定する必要があります。
var SeedBanks= require('./seeds/banks');
var exports = {
SeedBanks,
// place your seeds here
};
module.exports = exports;
種子を移行するには、Bellowコマンドを使用します。
> node cmd run:seed
これにより、CLI(コマンドラインインターフェイス)で特定のコマンドを実行できます。
カスタムコマンドを作成します。 /コマンドにロジックをホストするファイルを作成します/コマンドeg /commands/remove-users.jsは、以下のスニペットを含めることができます
var exports = {};
exports.removeOldUsers = (args) => {
// logic here
};
module.exports = exports;
次に、 /commands/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、callback);
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文字であることをチェックし、数値である場合に備えて、指定された数値が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
});
このボイラープレートには単体試験は含まれていません。ただし、自分で含めることを選択できます。
誰でも、誰でも貢献できます。
mit