Cet article présente principalement la méthode de nœud utilisant Koa2 pour créer des projets Web. L'éditeur pense que c'est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un œil. J'espère que cela pourra aider tout le monde.
À mesure que Node.js devient de plus en plus populaire, divers frameworks commencent à émerger les uns après les autres, et Node.js est progressivement utilisé dans des scénarios où les requêtes côté serveur sont traitées. Des frameworks pour construire des projets Web ont également commencé à apparaître - express, koa, koa2, egg, etc. Bien sûr, pour comprendre leur qualité, il faut toujours lire soi-même le code source. Cet article n'impliquera pas le code source, mais amènera seulement les débutants à comprendre brièvement l'utilisation de base de Koa2. Tout le monde est invité à communiquer et à apprendre les uns des autres dans les commentaires.
Remarque : koa2 utilise la syntaxe ES7, veuillez donc mettre à niveau la version de Node vers la dernière version lorsque vous l'utilisez. Pour des informations plus détaillées sur le code source, vous pouvez accéder à koajs/koa sur git pour apprendre
1. Structure du répertoire du projet
.2. Analyse logique du code
2.1. Fichier de structure du package
[package.json]
{ "name": "weixin-node-koa", "version": "1.0.0", "description": "node.js with koa2", "private": true, "dependencies": { "koa": "^2.0.0", "koa-router": "^7.0.0", "mysql":"2.13.0" }, "scripts": { "start": "node app.js" }, "engines": { "node": ">=6.0.0" }, "author": "Fly", "license": "CENTERM" }
2.2. Fichier d'entrée de démarrage
[app.js]
const Koa = require('koa'); const app = new Koa(); const router2controller = require('./app/router2controller.js'); const config = require('./config/config.local.js'); app.use(router2controller()); app.listen(config.port); console.log("Server started and listen on port " + config.port);
si demandé Le corps du message est au format XML Vous pouvez ajouter le code suivant pour analyser automatiquement le message (à noter que la version de koa-xxx citée doit correspondre à koa2)
const Koa = require('koa'); const app = new Koa(); const router2controller = require('./app/router2controller.js'); const config = require('./config/config.local.js'); //start接收到的xml数据请求单独解析存储 const xmlParser = require('koa-xml-body'); app.use(xmlParser()).use((ctx,next) => { ctx.data = ctx.request.body; return next(); }); //end app.use(router2controller()); app.listen(config.port); console.log("Server started and listen on port " + config.port);
Fichier du routeur .
[router2controller.js] Cette classe analysera automatiquement les fichiers dans le dossier du contrôleur pour charger le mappage des requêtes. Il n'est pas nécessaire de configurer chaque requête individuellementrouter .get('/', async (ctx,next) => { this.body = 'Hello World!'; }) .post('/users', async (ctx,next) => { //TODO }) .put('/users/:id', async (ctx,next) => { //TODO }) .del('/users/:id', async (ctx,next) => { //TODO });
const fs = require('fs'); const router = require('koa-router')(); function addMapping(router, mapping) { for (var url in mapping) { if (url.startsWith('GET ')) { var path = url.substring(4); router.get(path, mapping[url]); console.log(`register URL mapping: GET ${path}`); } else if (url.startsWith('POST ')) { var path = url.substring(5); router.post(path, mapping[url]); console.log(`register URL mapping: POST ${path}`); } else if (url.startsWith('PUT ')) { var path = url.substring(4); router.put(path, mapping[url]); console.log(`register URL mapping: PUT ${path}`); } else if (url.startsWith('DELETE ')) { var path = url.substring(7); router.del(path, mapping[url]); console.log(`register URL mapping: DELETE ${path}`); } else { console.log(`invalid URL: ${url}`); } } } function addControllers(router, dir) { fs.readdirSync(__dirname + '/' + dir).filter((f) => { return f.endsWith('.js'); }).forEach((f) => { console.log(`process controller: ${f}...`); let mapping = require(__dirname + '/' + dir + '/' + f); addMapping(router, mapping); }); } module.exports = function (dir) { var controllersDir = dir || 'controller'; addControllers(router, controllersDir); return router.routes(); };
2.4. Controller
[userController.js]***Controller.js est utilisé pour traiter une demande spécifique. informations et données de retour. userController.js gère les requêtes GET pour obtenir des informations sur les utilisateurs, les requêtes POST pour enregistrer les informations sur les utilisateursconst userService = require('./../service/userService.js'); var getUserinfo = (ctx, next) => { let query = ctx.query; let userId = query.id; let userInfo = userService.getUserById(userId); let html = '<html><body>' + '<p> userinfo: ' + userInfo + '</p>' + '</body></html>'; ctx.response.type ='text/html'; ctx.response.body = html; }; var saveUserinfo = (ctx, next) => { const requestString = ctx.data; //TODO数据处理 Console.log(requestString); }; module.exports = { 'GET /getUserinfo': getUserinfo, 'POST /saveUserinfo': saveUserinfo };
2.5.
[userService.js]Traite et encapsule les données obtenues à partir de ***Dao.js et les renvoie au contrôleurconst userDao = require('./../dao/userDao.js'); var getUserById = async (userId) => { var users = userDao.getUserById(userId); var responseContent = ''; for(let user of users) { reaponseContent += '姓名:' + user.name + ' |'; reaponseContent += '年龄:' + user.age + ' |'; reaponseContent += '身高:' + user.height + '<br />'; } return responseContent; } module.exports = { getUserById : getUserById };
2.6. Acquisition de données
[userDao.js]Obtenez les données utilisateur en demandant les paramètres entrants
const mysql = require('./../utils/mysqlUtil.js'); var getUserById = async (userId) => { let mysqlOptions = { sql : 'select * from table_user where user_id = ?', args : [userId] }; var users = await mysql.execQuery(mysqlOptions); if(users.length == 0) { return null; } else { return users; } }; module.exports = { getUserById : getUserById };
2.7. Fonctionnement de la base de données
[mysqlUtil.js]Inclut le contrôle du pool de connexions à la base de données et l'établissement de la connexion. et gestion des versions, et exécution des demandes d'opération de base de données initiées par Daoconst mysql = require('mysql'); const config = require('./../../config/config.local.js'); var connectionPool = mysql.createPool({ 'host' : config.database.host, 'port':config.database.port, 'user' : config.database.user, 'password' : config.database.password, 'database' : config.database.database, 'charset': config.database.charset, 'connectionLimit': config.database.connectionLimit, 'supportBigNumbers': true, 'bigNumberStrings': true }); var release = connection => { connection.end(function(error) { if(error) { console.log('Connection closed failed.'); } else { console.log('Connection closed succeeded.'); } }); }; var execQuery = sqlOptions => { var results = new Promise((resolve, reject) => { connectionPool.getConnection((error,connection) => { if(error) { console.log("Get connection from mysql pool failed !"); throw error; } var sql = sqlOptions['sql']; var args = sqlOptions['args']; if(!args) { var query = connection.query(sql, (error, results) => { if(error) { console.log('Execute query error !'); throw error; } resolve(results); }); } else { var query = connection.query(sql, args, function(error, results) { if(error) { console.log('Execute query error !'); throw error; } resolve(results); }); } connection.release(function(error) { if(error) { console.log('Mysql connection close failed !'); throw error; } }); }); }).then(function (chunk) { return chunk; }); return results; }; module.exports = { release : release, execQuery : execQuery }
10 articles recommandés sur koa2
Tutoriel sur l'utilisation du framework koa2 dans nodejs6
Tutoriel de partage sur l'utilisation du framework koa2 dans nodejs
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!