ๆ่ฟๅฟ่กไพๆฝฎๅๆ express ็ฉไบไธไธ,ๅฏซ็ฏๆ็ซ ไพ็ด้ไธไธๆดๅ้็จ,ๆ็จๅฐ็ๅทฅๅ ทๅฆไธ:
้ฆๅ ๅฎ่ฃ express-generator,้ๆฏไธๅๅฏไปฅ่ชๅ็ข็ express ้่ฆๅ งๅฎน็ๅทฅๅ ท
$ sudo npm i -g express-generator
ๅฎ่ฃๅฅฝไนๅพ,ๆๅๅๆๅฐๆๅๆณ่ฆ็็ฎ้ไพ็ข็ๅฐๆก่ณๆๅคพ,ๆ้ธ็จ twig ็ถไฝๆ็ๆจฃๆฟๅผๆ,ๆๅจ PHP ไฝฟ็จ CI ็ๆๅไนๆฏ้ธ็จๅไธๅๅผๆ,ๅฏไปฅ็ก็่ฝ็งป
/var/www $ sudo express -v twig project
/var/www $ cd project
/var/www/project $ sudo npm i
/var/www/project $ sudo npm i orm mysql --save
ๅฐๆก็ฎ้็ข็ๅพ,ๆๅๅฏไปฅไฝฟ็จ nodemon ไพ็ฃๆง็ฎ้,ไนๅฏไปฅ้ๅฐไฟฎๆนๆชๆกๅพ่ชๅ้่ตท็ๆๆ
/var/www/project $ sudo nodemon bin/www
้ๆๅๆ้ http://10.10.10.16:3000 (ๆ็ vm ๆธฌ่ฉฆ IP)ๅฐฑๅฏไปฅ็ๅฐ้ ่จญ็ถฒๅ,ๅฆๆๅธๆๆน port ็่ฉฑๅฏไปฅๅจ env ่จญๅฎ port,ๆ่
็ดๆฅๅปๆน bin/www ้ๅๆชๆก
ๆ้ app.js ้ๆฏ้ ่จญ็ๅ
งๅฎน
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var index = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'twig');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
ๆๆ็ๅไฝ้ฝๅจ้้ป app.js ่จญๅฎ,ๆๅไพๅปบ็ซไธๅ product routes ๆชๆก
routes/product.js
const express = require('express');
const router = express.Router();
router.get('/', function(req, res, next) {
res.render('product/index');
});
module.exports = router;
view/product/index.twig
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h3>This is product page</h3>
</body>
</html>
ๅฐ app.js ๅ ไธ้ๅ routes ็่จญๅฎ
app.js
var index = require('./routes/index');
var users = require('./routes/users');
var product = require('./routes/product');
var index = require('./routes/index');
var users = require('./routes/users');
var product = require('./routes/product');
app.use('/', index);
app.use('/users', users);
app.use('/product', product);
้ๆ็ถฒๅๆนๆ http://10.10.10.16:3000/product,ๅฐฑๆ็ๅฐ This is product page ้ๅนพๅๅญ
ๆฅไธไพๆๅ้ฒ่ก่ณๆๅบซ็ไธฒ้ฃ,ๅจ MySQL ๅ
งๅปบ็ซไธๅๅซ express ็่ณๆๅบซ,ๅฆๅคๅปบ็ซไธๅ products ็ table ไธฆไธๅกๅ
ฅ่ณๆ
CREATE TABLE `products` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ๆฅไธไพๆๅไพ่จญๅฎ่ณๆๅบซ้ฃๆฅ,ๅ ็บๆไธๅๆญกๅ
จ้จ็ๆฑ่ฅฟ้ฝๅกๅจ app.js,ๆไปฅๆๅฆๅค้ไธๅ่ณๆๅคพไพๆพ่จญ็ฝฎๆช
config/db.js
module.exports = (app, orm) => {
app.use(orm.express("mysql://root:123456@127.0.0.1/express", {
define: function(db, models, next) {
models.product = db.define('products', {
id: Number,
name: String
});
next();
}
}));
};
ไฟฎๆน app.js ๅๅ้ๅ่จญๅฎ,ๅช่ฆๆพๅจ app ไปฅๅ orm ๅๅงๅๅพๅณๅฏ
app.js
require('./config/db.js')(app, orm);
ๆๅๅ
ๅฐ routes/product.js ไฟฎๆนๆไปฅไธๅ
งๅฎน,่ฎๅฏไปฅๅพ็ถฒๅๅ
็ๅฐ็ตๆ
const express = require('express');
const router = express.Router();
router.get('/', function(req, res, next) {
req.models.product.all((err, data) => {
res.json(data);
})
});
module.exports = router;
http://10.10.10.16:3000/product
[{"id":1,"name":"product a"},{"id":2,"name":"product b"}]
้ๆฏๆๅบๆฌ็็จๆณ,ไฝๆ่ฆบๅพ้ๆจฃๅฏ้่คๅฉ็จๆงๅคชไฝไบ,ๆไปฅๆๅไพๅปบ็ซ้กไผผ model ๆฉๅถๅง
routes/product.js
const express = require('express');
const router = express.Router();
const Product = require('../model/product.js');
router.get('/', async(req, res, next) => {
try {
const product = new Product(req.models.product);
res.json(await product.getAllNews());
} catch (e) {
res.send(e);
}
});
module.exports = router;
model/product.js
class Product {
constructor(model) {
this.model = model
}
async getAllNews() {
return new Promise((resolve, reject) => {
this.model.all((err, data) => {
if (err) {
reject(err);
}
resolve(data);
})
})
}
}
module.exports = Product;
้ๆจฃ็ๅท่ก็ตๆๆไธๆจกไธๆจฃ,ไฝๆๆฑ่ฅฟๆไนพๆทจๆจก็ตๅไบ,ๅไฟฎๆนไธๆฌกๅจ view ๅ็พๅง
routes/product.js
const express = require('express');
const router = express.Router();
const Product = require('../model/product.js');
router.get('/', async(req, res, next) => {
try {
const product = new Product(req.models.product);
res.render('product/index', {
products: await product.getAllNews()
});
} catch (e) {
res.send(e);
}
});
module.exports = router;
views/product/index.twig
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h3>This is product page</h3>
{% for product in products %}
<div>product: {{ product.name }}</div>
{% endfor %}
</body>
</html>
ไปฅไธๅฐฑๆฏ้ๅ
ฉๅคฉ่ฉฆ็ฉ express ็ๆด็,ๆฒๆๅฏฆ็พๆ่ฌ็ controller ้จไปฝ,ๅฐฑๅ
ๆ routes ็ถ controller,็ถ็ถไธๅฎๆๆๆดๅคๆดๅฅฝ็ๆนๆณ,ๅๆ
ขๆ
ขๆข็ดข,ๅจๆญคไนๆ่ฌ้ณ้ปๅธๅคงๅคง็ๆๅฐ