ããããBudget ManagerãšåŒã°ããæ¬æ ŒçãªWebã¢ããªã±ãŒã·ã§ã³ã®éçºã«åããããã·ãªãŒãºã®æåã®è³æã§ãã äœæ¥äžã«äœ¿çšãããäž»ãªãœãããŠã§ã¢ããŒã«ã¯ããµãŒããŒçšã®Node.jsãããã³ããšã³ãçšã®Vue.jsãããŒã¿ããŒã¹ãšããŠã®MongoDBã§ãã

ãããã®è³æã¯ãJavaScriptã«ç²ŸéããŠãããNode.jsãnpmãããã³MongoDBã®åºæ¬ãçè§£ããŠãããNode-Vue-MongoDBãã³ãã«ããã³é¢é£æè¡ãåŠã³ããèªè
ã察象ãšããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ããŒãããäœæããã®ã§ããæ°ã«å
¥ãã®ã³ãŒããšãã£ã¿ãŒãçšæããŠãã ããã ãããžã§ã¯ããè€éã«ããªãããã«ãç§ãã¡ã¯Vuexã䜿çšãããäºæ¬¡çãªããšã«æ°ãåãããããšãªããæãéèŠãªããšã«éäžããããšããŸãã
ãã®è³æã®èè
ã§ãããã©ãžã«ã®éçºè
ã¯ã圌ã¯JavaScriptã®ç¬¬äžäººè
ãšã¯ã»ã©é ãããæ°ããç¥èãæ±ããŠã圌ãèŠã€ãããã®ãä»ã®äººãšå
±æããæºåãã§ããŠãããšèšããŸãã
ããã§ã¯ã次ã®åé¡ãæ€èšããŸãã
- ãããžã§ã¯ãæ§é ã®ç·šæã
- 䜿çšãããã©ã€ãã©ãªã®äŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ãšèª¬æã
- MongoDBã§ã®äœæ¥ãšMongooseã¢ãã«ã®äœæã
- ã¢ããªã±ãŒã·ã§ã³APIã¡ãœããã®éçºã
- ãšã¯ã¹ãã¬ã¹ã«ãŒãã®æºåã
- Passport.jsã䜿çšããJWTèªèšŒã®æ§æã
- Postmanã䜿çšããŠãããžã§ã¯ãããã¹ãããŸãã
ç§ãã¡ãåãçµãã§
ãããããžã§ã¯ãã®ã³ãŒãã¯ã GitHubã«ãããŸãã
ãããžã§ã¯ãæ§é ãšäŸåé¢ä¿ã®ã€ã³ã¹ããŒã«
ãŸãããããžã§ã¯ãã®ãã©ã«ããŒæ§é ãäœæããŸããããã¯ãäœæ¥ã®æåã®æ®µéã§æ¬¡ã®ããã«ãªããŸãã
APIãã©ã«ããŒæ§é ãããªã¢ã«ãé²ããã«ã€ããŠããã®æ§é ã倧å¹
ã«æ¡åŒµããŸãã
次ã«ãããã€ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ããããžã§ã¯ãã®ã«ãŒããã©ã«ããŒïŒããã§ã¯
focus-budget-manager
ïŒã«ç§»åãã
npm init
ã³ãã³ãã§ä»¥åã«
package.json
ããŠã次ã®ã³ãã³ããå®è¡ããŸãã
npm i --save express body-parser mongoose consign cors bcrypt jsonwebtoken morgan passport passport-jwt module-alias
ãããã®äŸåé¢ä¿ãšãããžã§ã¯ãã§ã®åœ¹å²ã®äžéšãæ€èšããŠãã ããã
- ãšã¯ã¹ãã¬ã¹ ããã¯Node.jsã®ãã¬ãŒã ã¯ãŒã¯ã§ãããAPIã®éçºã容æã«ããããã«äœ¿çšããŸãã
- ããã£ããŒãµãŒã ãã®ããã±ãŒãžã¯ãNode.jsã®ã¯ãšãªæ¬æããŒãµãŒã§ãã åä¿¡ãªã¯ãšã¹ãã®æ¬æããã³ãã©ãŒã«æž¡ãåã«è§£æããã®ã«åœ¹ç«ã¡ãŸãããã®çµæã
req.body
ããããã£ã䜿çšããŠããããåŠçã§ããŸãã
- ãã³ã°ãŒã¹ã ããã¯ãéåæç°å¢ã§åäœããããã«èšèšãããMongoDBã®ãªããžã§ã¯ãã¢ããªã³ã°ããŒã«ã§ãã
- å§èšã ãã®ããã±ãŒãžã¯è£å©ã§ããã䜿çšããå¿
èŠã¯ãããŸããã èµ·åã¹ã¯ãªãããæŽçããããã«èšèšãããŠããŸãã
- CORSã ãã®ããã±ãŒãžã¯ãCORSãã¢ã¯ãã£ãã«ããããã«äœ¿çšã§ããConnect / Expressãã«ããŒããŒã«ã§ãã
- Bcryptã ãã®ããã±ãŒãžã䜿çšããŠãæå·åã®ãå¡©ããšããã·ã¥ãçæããŸãã
- ã¢ãŒã¬ã³ ããã¯ãHTTPèŠæ±ãèšé²ããããã«èšèšãããNode.jsã®ãã«ããŒã§ãã
- ã¢ãžã¥ãŒã«ã®ãšã€ãªã¢ã¹ã ãã®ããã±ãŒãžã䜿çšãããšããã©ã«ããŒã®ãšã€ãªã¢ã¹ãäœæããNode.jsã«ç¬èªã®ã¢ãžã¥ãŒã«ãã¹ãç»é²ã§ããŸãã
ããã±ãŒãžãã€ã³ã¹ããŒã«ããåŸãGitã䜿çšããäºå®ãããå Žåã¯ããããžã§ã¯ãã®ã«ãŒããã©ã«ããŒã«
.gitignore
ãã¡ã€ã«ãäœæããŸãã 以äžãèšè¿°ããŸãïŒ
/node_modules/
æºåäœæ¥ãå®äºããã®ã§ãããã°ã©ãã³ã°ãå§ããŸãã
ãã¡ã€ã«BudgetManagerAPI / config / index.js
BudgetManagerAPI/config
index.js
BudgetManagerAPI/config
ãã¡ã€ã«ãäœæããæ¬¡ã®ã³ãŒãã远å ããŸãã
module.exports = { secret: 'budgetsecret', session: { session: false }, database: 'mongodb://127.0.0.1:27017/budgetmanager' }
ãã®ãã¡ã€ã«ã«ã¯ãããŒã¿ããŒã¹æ¥ç¶ãã©ã¡ãŒã¿ãŒãšãJWTããŒã¯ã³ã®äœæã«äœ¿çšããç§å¯éµãå«ãŸããŠããŸãã
ããã¯ãããŒã«ã«MongoDBãµãŒããŒã§åäœããããšã«ãªã£ãŠããŸãã åæã«ãè¡
127.0.0.1:27017
localhost
ã䜿çšã§ããŸãã å¿
èŠã«å¿ããŠãããšãã°MLabsã䜿çšããŠäœæãããMongoDBã¯ã©ãŠãããŒã¿ããŒã¹ãæäœã§ããŸãã
ãã¡ã€ã«BudgetManagerAPI / app / models / user.js
JWTèªèšŒã«äœ¿çšããã
User
ã¢ãã«ãäœæã
User
ã ãããè¡ãã«ã¯ã
BudgetManagerAPI/app
ãã©ã«ããŒã«ç§»åãããã®äžã«
models
ãã£ã¬ã¯ããªãŒãäœæãããã®äžã«
user.js
ãã¡ã€ã«ã
user.js
ãŸãã ãã¡ã€ã«ã®å
é ã§ãäŸåé¢ä¿ãæ¥ç¶ããŸãã
const mongoose = require('mongoose'), bcrypt = require('bcrypt');
ããã§ã¯ã
User
ã¢ãã«ãäœæããããã«
mongoose
ããã±ãŒãžãå¿
èŠã§ã
bcrypt
ããã±ãŒãžããŒã«ã¯ããŠãŒã¶ãŒãã¹ã¯ãŒããããã·ã¥ããããã«äœ¿çšãããŸãã
ãã®åŸãåããã¡ã€ã«ã«æ¬¡ã远å ããŸãã
const Schema = mongoose.Schema({ username: { type: String, unique: true, required: true }, password: { type: String, required: true }, clients: [{}] });
ãã®ã³ãŒãã¯ã
User
ããŒã¿ã¹ããŒããäœæããããã®ãã®ã§ãã ãã®èª¬æã«ãããæ¬¡ã®ããŒã¿ãã·ã¹ãã ã®ãŠãŒã¶ãŒã«å²ãåœãŠãããŸãã
- ãŠãŒã¶ãŒå
- ãã¹ã¯ãŒã
- ã¯ã©ã€ã¢ã³ãã®ãªã¹ãïŒ
clients
ïŒã
ã¯ã©ã€ã¢ã³ãæ
å ±ã«ã¯ãé»åã¡ãŒã«ã¢ãã¬ã¹ïŒé»åã¡ãŒã«ïŒãååïŒååïŒãé»è©±ïŒé»è©±ïŒãããã³è²¡åæžé¡ïŒäºç®ïŒãå«ãŸããŸãã 財åããã¥ã¡ã³ãã«ã¯ãç¶æ
ãã¿ã€ãã«ãã¢ã€ãã ãäŸ¡æ Œãªã©ã®ããŒã¿ãå«ãŸããŸãã
user.js
ãã¡ã€ã«ãåŒãç¶ã䜿çšããæ¬¡ã®ã³ãŒãã远å ããŸãã
// - Schema.pre('save', function (next) { const user = this; if (this.isModified('password') || this.isNew) { bcrypt.genSalt(10, (error, salt) => { if (error) return next(error); bcrypt.hash(user.password, salt, (error, hash) => { if (error) return next(error); user.password = hash; next(); }); }); } else { return next(); } });
ãã®é¢æ°ã§ã¯ããŠãŒã¶ãŒãã¹ã¯ãŒãã®æå·åãœã«ããšããã·ã¥ãçæããŸãã
ãã®é¢æ°ã®ã³ãŒãã«åŸã£ãŠããã¹ã¯ãŒããæ¯èŒããã·ã¹ãã ãžã®ãŠãŒã¶ãŒã¢ã¯ã»ã¹ã®æå¹æ§ã確èªãã颿°ã远å ããŸãã
Schema.methods.comparePassword = function (password, callback) { bcrypt.compare(password, this.password, (error, matches) => { if (error) return callback(error); callback(null, matches); }); };
次ã«ããã¡ã€ã«ã®æåŸã§ã
User
ã¢ãã«ãäœæã
User
ã
mongoose.model('User', Schema);
ãã¡ã€ã«BudgetManagerAPI / config / passport.js
User
ã¢ãã«ã®æºåãã§ãããã
passport.js
ãã¡ã€ã«ã
BudgetManagerAPI/config
ãã©ã«ããŒã«äœæããŸãã äŸåé¢ä¿æ¥ç¶ã䜿çšããŠãã®ãã¡ã€ã«ã®äœæ¥ãå§ããŸãããã
const PassportJWT = require('passport-jwt'), ExtractJWT = PassportJWT.ExtractJwt, Strategy = PassportJWT.Strategy, config = require('./index.js'), models = require('@BudgetManager/app/setup');
User
ã¢ãã«ã
passport-jwt
ã¯
passport-jwt
ããã±ãŒãžãå¿
èŠã§ã
passport-jwt
ã¯èªèšŒãæŽçããããã®ãã®ã§ãã
次ã«ããã®ãã¡ã€ã«ã«æ¬¡ã远å ããŸãã
module.exports = (passport) => { const User = models.User; const parameters = { secretOrKey: config.secret, jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken() }; passport.use(new Strategy(parameters, (payload, done) => { User.findOne({ id: payload.id }, (error, user) => { if (error) return done(error, false); if (user) done(null, user); else done(null, false); }); })); }
ããã§ã¯ã
User
ã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã¯ã©ã€ã¢ã³ãããåä¿¡ããJWTããŒã¯ã³ãæ€çŽ¢ããŠãŠãŒã¶ãŒãèŠã€ããŸãã
ãã¡ã€ã«BudgetManagerAPI / config / database.js
BudgetManagerAPI/config
ãã©ã«ããŒã§ã
database.js
æäœãæ
åœãã
database.js
ãã¡ã€ã«ãäœæããŸãã ãã®ãã¡ã€ã«ã«æ¬¡ã远å ããŸãã
module.exports = (mongoose, config) => { const database = mongoose.connection; mongoose.Promise = Promise; mongoose.connect(config.database, { useMongoClient: true, promiseLibrary: global.Promise }); database.on('error', error => console.log(`Connection to BudgetManager database failed: ${error}`)); database.on('connected', () => console.log('Connected to BudgetManager database')); database.on('disconnected', () => console.log('Disconnected from BudgetManager database')); process.on('SIGINT', () => { database.close(() => { console.log('BudgetManager terminated, connection closed'); process.exit(0); }) }); };
ããã§ã¯ãæåã«
mongoose
ãæšæºã®
Promise
ãªããžã§ã¯ãã®äœ¿çšã«åãæ¿ããŸããã ãããè¡ããªããšãã³ã³ãœãŒã«ã«èŠåã衚瀺ãããå ŽåããããŸãã æ¬¡ã«ãæšæºã®
mongoose
æ¥ç¶ãäœæããŸããã
ãµãŒããŒã®ã»ããã¢ããããµãŒãã¹/ index.jsãã¡ã€ã«
ããã€ãã®è£å©ãµãã·ã¹ãã ãåŠçããåŸããµãŒããŒã®æ§æãéå§ããŸãã
services
ãã©ã«ããŒã«ç§»åããæ¢ã«ãã®äžã«ãã
index.js
ãã¡ã€ã«ãéããŸãã 以äžã远å ããŸãã
require('module-alias/register'); const http = require('http'), BudgetManagerAPI = require('@BudgetManagerAPI'), BudgetManagerServer = http.Server(BudgetManagerAPI), BudgetManagerPORT = process.env.PORT || 3001, LOCAL = '0.0.0.0'; BudgetManagerServer.listen(BudgetManagerPORT, LOCAL, () => console.log(`BudgetManagerAPI running on ${BudgetManagerPORT}`));
åŸã§èšå®ãã
module_alias
ãæ¥ç¶ããããšããå§ããŸãïŒãã®æé ã¯ãªãã·ã§ã³ã§ããããã®ã¢ãããŒãã¯ã³ãŒãããããããã«ããã®ã«åœ¹ç«ã¡ãŸãïŒã
module_alias
代ããã«
@BudgetManagerAPI
ããã±ãŒãžã䜿çšããªãå Žåã¯ã.
module_alias
/
@BudgetManagerAPI
/
@BudgetManagerAPI
ãèšè¿°ããå¿
èŠããã
./services/BudgetManagerAPI/config
ã
ãµãŒããŒãèµ·åããã«ã¯ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ç§»åãã䜿çšããã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒããªã¿ãŒã«
node services
ã³ãã³ããå
¥åã
node services
ã
ãã¡ã€ã«BudgetManagerAPI / config / app.js
BudgetManagerAPI/config
ãã£ã¬ã¯ããªã§ã
app.js
ãã¡ã€ã«ãäœæããŸãã éå§ããã«ã¯ãäŸåé¢ä¿ãæ¥ç¶ããŸãããã
const express = require('express'), app = express(), bodyParser = require('body-parser'), mongoose = require('mongoose'), morgan = require('morgan'), consign = require('consign'), cors = require('cors'), passport = require('passport'), passportConfig = require('./passport')(passport), jwt = require('jsonwebtoken'), config = require('./index.js'), database = require('./database')(mongoose, config);
passportConfig = require('./passport')(passport)
ã¯ã
passport
ã®æ§æãã¡ã€ã«ãã€ã³ããŒããã
passport.js
ã«ã¯æ¬¡ã®ã³ãã³ãããããããåŒæ°ãšããŠ
passport
ãæž¡ããŸãã

ãã®ã¢ãããŒãã®ãããã§ã
passport.js
ãã¡ã€ã«å
ã®
passport.js
ãæ¥ç¶ããããšãªãæäœã§ããŸãã
次ã«ã
app.js
ãã¡ã€ã«ã§ãããã±ãŒãžã®æäœãéå§ããç§å¯ããŒãèšå®ããŸãã
app.use(express.static('.')); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(morgan('dev')); app.use(cors()); app.use(passport.initialize()); app.set('budgetsecret', config.secret);
ãŸãã¯ã
cors
ããã±ãŒãžã䜿çšãã代ããã«ã次ã®ããšãå®è¡ã§ããŸãã
app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); });
package.jsonã®æ§æ
ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ç§»åãã
package.json
ãéããŠã
dependencies
ãããã¯ã®çŽåã«ä»¥äžã远å ããŸãã
"homepage": "https://github.com/gdomaradzki/focus-gestor-orcamentos#readme", "_moduleAliases": { "@root": ".", "@BudgetManager": "./services/BudgetManagerAPI", "@BudgetManagerModels":"./services/BudgetManagerAPI/app/models", "@BudgetManagerAPI":"./services/BudgetManagerAPI/config/app.js", "@config": "./services/BudgetManagerAPI/config/index.js" }, "dependencies": {
dependencies
ãããã¯ã¯æ¢ã«ãã¡ã€ã«å
ã«ããããã
_moduleAliases
homepage
ãš
_moduleAliases
ãããã¯ã远å ããã ãã§ããããšã«æ³šæããŠãã ããã
ãããã®å€æŽã«ããã
@root
ãšã€ãªã¢ã¹ã䜿çšããŠãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ã¢ã¯ã»ã¹ãã
@root
ãšã€ãªã¢ã¹ã䜿çšããŠ
index.js
æ§æãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
ãã¡ã€ã«BudgetManagerAPI / app / setup / index.js
ãšã€ãªã¢ã¹ãèšå®ã
BudgetManagerAPI/app
ã
BudgetManagerAPI/app
ãã©ã«ããŒã«ç§»åããŠãæ°ãã
setup
ãã©ã«ããŒãäœæãããã®äžã«
index.js
ãã¡ã€ã«ãäœæããŸãã 以äžã远å ããŸãã
const mongoose = require('mongoose'), UserModel = require('@BudgetManagerModels/user');; const models = { User: mongoose.model('User') } module.exports = models;
ä»ã®äœããã¢ããªã±ãŒã·ã§ã³ã«ããŒããããåã«ã¢ãã«ã®ããŒãã確å®ã«ããããã«ãããè¡ããŸãã
ãã¡ã€ã«BudgetManagerAPI / app / api / auth.js
çŸåšãAPIã¡ãœããã®ããã€ããäœæãå§ããŠããŸãã
BudgetManagerAPI/app
ãã©ã«ããŒã«ç§»åããŠããã®äžã«
api
ãã£ã¬ã¯ããªãŒãäœæãããã®äžã«
auth.js
ãã¡ã€ã«ã
auth.js
ãŸãã ç§ãã¡ã¯ããã«ä»¥äžãæžããŸãïŒ
const mongoose = require('mongoose'), jwt = require('jsonwebtoken'), config = require('@config');
module_alias
ã¢ãžã¥ãŒã«ã®ãããã§ãã³ãŒãã¯ãªãŒããŒãäœæããããšã«æ³šæããŠãã ããã ããã§ãªããã°ãç§ã¯æ¬¡ã®ãããªãã®ãæžããªããã°ãªããŸããïŒ
config = require('./../../config);
ããã§ãããã±ãŒãžãæ¥ç¶ããåŸãåããã¡ã€ã«ã§æ¬¡ã®ããšãè¡ããŸãã
const api = {}; api.login = (User) => (req, res) => { User.findOne({ username: req.body.username }, (error, user) => { if (error) throw error; if (!user) res.status(401).send({ success: false, message: 'Authentication failed. User not found.' }); else { user.comparePassword(req.body.password, (error, matches) => { if (matches && !error) { const token = jwt.sign({ user }, config.secret); res.json({ success: true, message: 'Token granted', token }); } else { res.status(401).send({ success: false, message: 'Authentication failed. Wrong password.' }); } }); } }); }
ããã§ã¯ãå¿
èŠãªãã¹ãŠã®ã¡ãœãããä¿åãã空ã®
api
ãªããžã§ã¯ããäœæããŸãã æåã«ã
User
ã¡ãœããã
login
ã¡ãœããã«æž¡ããŸããããã§ã¯ã
User
ã¢ãã«ã«ã¢ã¯ã»ã¹ããã¡ãœãããå¿
èŠãªã®ã§ã次ã«ã
req
ããã³
res
åŒæ°ãæž¡ããŸãã
ãã®ã¡ãœããã¯ã
User
username
äžèŽãã
User
ãªããžã§ã¯ããæ€çŽ¢ã
username
ã ãŠãŒã¶ãŒåãèªèã§ããªãå Žåã¯ãšã©ãŒãçºçããããã§ãªãå Žåã¯ãŠãŒã¶ãŒã«é¢é£ä»ããããŠãããã¹ã¯ãŒããšããŒã¯ã³ã確èªããŸãã
次ã«ãããŒã¯ã³ãåä¿¡ããŠââè§£æãããã1ã€ã®
api
ã¡ãœãããå¿
èŠã§ãã
api.verify = (headers) => { if (headers && headers.authorization) { const split = headers.authorization.split(' '); if (split.length === 2) return split[1]; else return null; } else return null; }
ãã®ã¡ãœããã¯ããããŒããã§ãã¯ãã
Authorization
ããããŒãååŸããŸãã ããããã¹ãŠã®ã¹ãããã®åŸãæçµçã«
api
ãªããžã§ã¯ãããšã¯ã¹ããŒãã§ããŸãã
module.exports = api;
API RoutesãBudgetManagerAPI / app / routes / auth.jsãã¡ã€ã«
APIã«ãŒããäœæããŸãããã ãããè¡ãã«ã¯ã
services/BudgetManagerAPI/app
ãã©ã«ããŒã«ç§»åãããã®äžã«
routes
ãã£ã¬ã¯ããªãäœæããŸããããã§ã次ã®å
容ã®
auth.js
ãã¡ã€ã«ãäœæããŸãã
const models = require('@BudgetManager/app/setup'); module.exports = (app) => { const api = app.BudgetManagerAPI.app.api.auth; app.route('/') .get((req, res) => res.send('Budget Manager API')); app.route('/api/v1/auth') .post(api.login(models.User)); }
ãã®ã¢ãžã¥ãŒã«ã«
app
ãªããžã§ã¯ããæž¡ãã®ã§ãã«ãŒããèšå®ã§ããŸãã ããã§ã
api
宿°ãèšå®ããŸããããã¯ã
api
ãã©ã«ããŒå
ã®
auth.js
ãã¡ã€ã«ãæäœããããã«äœ¿çšããŸãã ããã§ã¯ãããã©ã«ãã«ãŒã
'/'
ãèšå®ããŸããã¢ã¯ã»ã¹ãããšãæååãBudget Manager APIãããŠãŒã¶ãŒã«æž¡ãããŸãã æ¬¡ã«ãã«ãŒã
'/api/v1/auth'
ãäœæããŸãïŒPOSTèŠæ±ã䜿çšãããäœæ¥çšïŒã ãã®ã«ãŒããæäŸããã«ã¯ã
login
ã¡ãœããã䜿çšããŠã
User
ã¢ãã«ãåŒæ°ãšããŠæž¡ããŸãã
ãã¡ã€ã«BudgetManagerAPI / config / app.js
次ã«ã
BudgetManagerAPI/config
ãã©ã«ããŒã«ãã
app.js
ãã¡ã€ã«ã«æ»ããæ¬¡ã®è¡ã远å ããŸãïŒ
app.set('budgetsecret', config.secret)
ã¬ã€ãã©ã€ã³ãšããŠæå®ãããŠããŸãã2åç®ã«ãã¡ã€ã«ã«è¿œå ããå¿
èŠã¯ãããŸããïŒã
app.set('budgetsecret', config.secret); consign({ cwd: 'services' }) .include('BudgetManagerAPI/app/setup') .then('BudgetManagerAPI/app/api') .then('BudgetManagerAPI/app/routes') .into(app); module.exports = app;
ããã§ã¯ãä»ã®ã¢ã¯ã·ã§ã³ãå®è¡ããåã«ã
setup
ãã©ã«ããŒã®ã³ã³ãã³ããèªã¿èŸŒãŸããŠãããã©ããã確èªããã¢ãã«ãæåã«ã€ã³ã¹ã¿ã³ã¹åãããããã«ããŸãã æ¬¡ã«ãAPIã¡ãœãããããŒãããæåŸã«ã«ãŒããããŒãããŸãã
ãã¡ã€ã«BudgetManagerAPI / app / api / user.js
BudgetManagerAPI/app/api
ãã©ã«ããŒã«
user.js
ããã®äžã«
user.js
ãã¡ã€ã«ãäœæããŸãã æ¬¡ã®ã³ãŒããå
¥ããŠãã ããïŒ
const mongoose = require('mongoose'); const api = {}; api.setup = (User) => (req, res) => { const admin = new User({ username: 'admin', password: 'admin', clients: [] }); admin.save(error => { if (error) throw error; console.log('Admin account was succesfully set up'); res.json({ success: true }); }) }
setup
æ¹æ³ã§ã¯ããããã°çšã®ç®¡çè
ã¢ã«ãŠã³ããäœæã§ããŸãã 宿ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®ã¢ã«ãŠã³ãã¯ããã§ã¯ãããŸããã
次ã«ãåããã¡ã€ã«å
ã§ããã¹ãç®çã§äœ¿çšããã¡ãœãããäœæããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã«ç»é²ããèªèšŒã¡ã«ããºã ã確èªããå¿
èŠããããã¹ãŠã®ãŠãŒã¶ãŒããªã¹ãã§ããŸãã
api.index = (User, BudgetToken) => (req, res) => { const token = BudgetToken; if (token) { User.find({}, (error, users) => { if (error) throw error; res.status(200).json(users); }); } else return res.status(403).send({ success: false, message: 'Unauthorized' }); }
次ã«ãåŸã§å¿
èŠã«ãªã
signup
ã¡ãœãããäœæããŸãã æ°ãããŠãŒã¶ãŒãç»é²ããããã«èšèšãããŠããŸãã
api.signup = (User) => (req, res) => { if (!req.body.username || !req.body.password) res.json({ success: false, message: 'Please, pass a username and password.' }); else { const newUser = new User({ username: req.body.username, password: req.body.password, clients: [] }); newUser.save((error) => { if (error) return res.status(400).json({ success: false, message: 'Username already exists.' }); res.json({ success: true, message: 'Account created successfully' }); }) } } module.exports = api;
ããã§ãæ°ãããŠãŒã¶ãŒãç»é²ããããšãããšãã«ã
username
ãš
password
ãã£ãŒã«ãã
password
ãŠãããã©ããããã§ãã¯ãã
password
ãããŠããå Žåã¯ãæå¹ãªãŠãŒã¶ãŒåãå
¥åããããšæ°ãããŠãŒã¶ãŒãäœæãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®äœæ¥ã®ãã®æ®µéã§ã¯ããŠãŒã¶ãŒãšäœæ¥ããããã®APIã¡ãœãããæºåã§ããŠãããšæ³å®ããŠããŸãã
ãã¡ã€ã«BudgetManagerAPI / app / routes / user.js
次ã«ã
BudgetManagerAPI/app/routes
ãã©ã«ããŒã«
user.js
ãã¡ã€ã«ãäœæããæ¬¡ã®ã³ãŒããæžã蟌ã¿ãŸãã
const passport = require('passport'), config = require('@config'), models = require('@BudgetManager/app/setup'); module.exports = (app) => { const api = app.BudgetManagerAPI.app.api.user; app.route('/api/v1/setup') .post(api.setup(models.User)) app.route('/api/v1/users') .get(passport.authenticate('jwt', config.session), api.index(models.User, app.get('budgetsecret'))); app.route('/api/v1/signup') .post(api.signup(models.User)); }
ããã§ã¯ãèªèšŒçšã®
passport
ã©ã€ãã©ãªãã€ã³ããŒãããæ§æãã¡ã€ã«ãæ¥ç¶ããŠã»ãã·ã§ã³ãã©ã¡ãŒã¿ãŒãæ§æããã¢ãã«ãæ¥ç¶ããããããŠãŒã¶ãŒãAPIãšã³ããã€ã³ããæäœããæš©å©ãæã£ãŠãããã©ããã確èªã§ããŸãã
ãã¹ã
æåã«ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãšããŒã¿ããŒã¹ãµãŒããŒãå®è¡ããŠãäœæãããã®ã確èªããŸãã ã€ãŸããã¢ãã¬ã¹
httpïŒ// localhostïŒ3001 /ã«ç§»åãããšããµãŒããŒãå®è¡ãããŠããã¿ãŒããã«ãŠã£ã³ããŠã§ããªã¯ãšã¹ãã«é¢ããæ
å ±ïŒãªã¯ãšã¹ããæåããããšãæå³ãã200ïŒã衚瀺ãããŸããå¿çã æ¬¡ã®ããã«ãªããŸãã

ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãã€ãŸããã©ãŠã¶ã¯ããäºç®ãããŒãžã£ãŒAPIããšããããã¹ããå«ãéåžžã®ããŒãžã衚瀺ããå¿
èŠããããŸãã
httpïŒ// localhostïŒ3001 / api / v1 / authããã¢ã¯ã»ã¹ã§ããã«ãŒã
route
確èªããŸãããã
ã¹ããŒã¿ã¹ã404ã®GETãªã¯ãšã¹ãã«é¢ããã¡ãã»ãŒãžããµãŒããŒãŠã£ã³ããŠã«è¡šç€ºãããŸãïŒããã¯ãµãŒããŒã«æ¥ç¶ã§ããããå¿
èŠãªãã®ãæäŸã§ããªãããšã瀺ããŸãïŒããã³å¿çæéã

ããã¯ããã®APIãšã³ããã€ã³ããPOSTãªã¯ãšã¹ãã«ã®ã¿äœ¿çšããŠããããã§ãã GETãªã¯ãšã¹ããå®è¡ããå ŽåããµãŒããŒã«ã¯å¿çãããã®ããããŸããã
httpïŒ// localhostïŒ3001 / api / v1 / usersã«ã¢ã¯ã»ã¹ã㊠ã
user
ã«ãŒãã確èªã
ãŸã ã ãµãŒããŒã¯ãã¹ããŒã¿ã¹401ã®GETã¡ãœãããå ±åããŸããããã¯ãã¿ãŒã²ãããªãœãŒã¹ãæäœããããã®ååãªç¹æš©ããªããããèŠæ±ãåŠçãããªãã£ãããšã瀺ããŸãã ã¯ã©ã€ã¢ã³ãã¯ãããã¹ããUnauthorizedããå«ãããŒãžãçºè¡ããŸãã
ããã«ãããèªèšŒã·ã¹ãã ãæ©èœããŠãããšå€æã§ããŸãããããã§ã¯ãç»é²ãã©ãŒã ããæã£ãŠããªãå Žåããã°ã€ã³æ¹æ³ã確èªããæ¹æ³ã«ã€ããŠã®è³ªåãçºçããŸãã
ãã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãPostmanã䜿çšããããšã§ãã éåžžã®ã¢ããªã±ãŒã·ã§ã³ãšããŠ
ããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããããChromeãã©ãŠã¶ãŒã®
æ¡åŒµåœ¢åŒã䜿çšã§ããŸãã
Postmanã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ã
éå§ããã«ã¯ã
setup
ãšã³ããã€ã³ãã«æ¥ç¶ããŠç®¡çè
ã¢ã«ãŠã³ããäœæããŸãã Postmanã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ã次ã®ããã«ãªããŸãã

ã¢ãã¬ã¹ãã£ãŒã«ãã«
http://localhost:3001/api/v1/setup
ãšå
¥åãããªã¯ãšã¹ãã¿ã€ãã
POST
倿ŽããŠã[
Send
]ãã¿ã³ãã¯ãªãã¯ããŸãã ãµãŒããŒã®JSONå¿çã«ã¯ãã¡ãã»ãŒãž
"success": true
ãå«ãŸããŠããå¿
èŠããããŸãã
次ã«ã管çè
ã¢ã«ãŠã³ãã§ãã°ã€ã³ããŠã¿ãŠãã ããã

ãããè¡ãã«ã¯ããšã³ããã€ã³ã
http://localhost:3001/api/v1/auth
ãžã®POSTãªã¯ãšã¹ãã䜿çšããŠã[
Body
]ã¿ãã§åã
admin
å€ã§
username
ãš
password
ããŒãèšå®ãã[
Send
]ãã¿ã³ãæŒããŸãã
ãµãŒããŒã®å¿çã¯ã次ã®ç»åã®ããã«ãªããŸãã

次ã«ãã·ã¹ãã ãŠãŒã¶ãŒã®ãªã¹ããååŸããŸãã

ãããè¡ãã«ã¯ã
token
ããŒã®å€ãã³ããŒããGETãªã¯ãšã¹ãã
http://localhost:3001/api/v1/users
ããŠãã¢ãã¬ã¹ãã£ãŒã«ãã«
http://localhost:3001/api/v1/users
ãšå
¥åãã[
Headers
]ã¿ãã§ã
Bearer token
ïŒ
token
ãªã
token
以åã«åä¿¡ãããµãŒããŒå¿çããã³ããŒãããããŒã¯ã³ã貌ãä»ããŸãïŒã åãå Žæã§ãå€
application/x-www-form-urlencoded
ã®
Content-Type
ããããŒã远å ãã
Send
ãã¯ãªãã¯ããŸãã
å¿çã¯JSONé
åã§ããå¿
èŠããããŸããJSONé
åã®å Žåã管çè
ã§ãã1人ã®ãŠãŒã¶ãŒã®ã¿ã«é¢ããæ
å ±ããããŸãã

次ã«ãæ°ãããŠãŒã¶ãŒç»é²æ¹æ³
signup
確èªããŸãã

ãããè¡ãã«ã¯ãæ°ããã¿ããéãããšã³ããã€ã³ã
http://localhost:3001/api/v1/signup
ãžã®POSTãªã¯ãšã¹ããæ§æãã[
Body
]ã¿ãã§ã
x-www-form-urlencoded
ã¹ã€ãããéžæããæ¬¡ã®å€ãšã¯ç°ãªã
username
ãš
password
ããŒã
password
ãŸã
admin
ãã¯ãªãã¯ãã[
Send
]
Send
ã¯ãªãã¯ããŸãã ãã¹ãŠãæ£åžžã«æ©èœããå Žåãæ¬¡ã®å¿çã衚瀺ãããŸãã

次ã«ã
http://localhost:3001/api/v1/users
ç§»åãã
Postman
ã¿ãã«æ»ã£ãŠ
http://localhost:3001/api/v1/users
ã®ãªã¹ããååŸãã
Send
ãã¯ãªãã¯ãããšã管çè
ãšæ°ãããŠãŒã¶ãŒã衚ã2ã€ã®ãªããžã§ã¯ãã®é
åãè¿ãããŸãã

ãŸãšã
ããã§ããã®ã·ãªãŒãºã®æåã®ããŒãã¯çµããã§ãã ããã§ã¯ããŒãããNode.jsã¢ããªã±ãŒã·ã§ã³ãäœæããç°¡åãªJWTèªèšŒãã»ããã¢ããããæ¹æ³ãåŠã³ãŸããã æ¬¡ã®ããŒãã§ã¯ãVue.jsã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®éçºãéå§ããŸãã
芪æãªãèªè
ïŒ èè
ã«ãã£ãŠææ¡ãããèè
èªèšŒæ¹æ³ã¯ãæ¬çªç°å¢ã§ã®äœ¿çšã«é©ããŠãããšæããŸããïŒ