1.安装生成器

npm install express-generator -g

2. 创建名称为APP的应用:

express my-project

3.安装依赖包

cd my-project

npm install

4、启动应用

npm start

5、在浏览器中使用 localhost:3000访问

  默认的端口就是3000

  更改端口:

    路径:app/bin/www

    var port = normalizePort(process.env.PORT || '3000');

6、设置请求跨域头

// app.js

app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:3000");
res.header("Access-Control-Allow-Origin", "http://localhost:8080");
res.header("Access-Control-Allow-Origin", "http://127.0.0.1:8080");
// res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
next();
});

注:该模板默认用的是 .jade 文件作为模板渲染 若要使用 ejs 可按照一下方法配置

1、安装 ejs

npm install ejs -S

2、在app.js中添加一下代码

var ejs = require('ejs');
app.engine('.html', ejs.__express);
app.set('view engine', 'html');

3、将view文件夹中的模板替换成  .html 文件即可(每次配置一个路由需要重新启动一下服务器)

参考文档:

https://www.jianshu.com/p/b555ba6f4067

mysql数据库配置

1、安装mysql

npm install mysql -S

2、建立对应的文件

//mysql.js
// MySQL数据库联接配置封裝
var mysql = {
host: '127.0.0.1',
user: 'root',
password: 'tll456456',
database: 'test',
port: 3306
};
module.exports = mysql;
//handel.js
/*
数据增删改查模块封装
req.query 解析GET请求中的参数 包含在路由中每个查询字符串参数属性的对象,如果没有则为{}
req.params 包含映射到指定的路线“参数”属性的对象,如果有route/user/:name,那么“name”属性可作为req.params.name
req.body通常用来解析POST请求中的数据
+req.query.id 可以将id转为整数
*/
// 引入mysql
var mysql = require('mysql');
// 引入mysql连接配置
var mysqlconfig = require('../config/mysql');
// 引入连接池配置
var poolextend = require('./poolextend');
// 引入SQL模块
var sql = require('./sql');
// 引入json模块
var json = require('./json');
// 使用连接池,提升性能
var pool = mysql.createPool(poolextend({}, mysqlconfig));
var userData = {
add: function(req, res, next) {
pool.getConnection(function(err, connection) {
var param = req.query || req.params;
connection.query(sql.insert, [param.id, param.name, param.age], function(err, result) {
if (result) {
result = 'add'
}
// 以json形式,把操作结果返回给前台页面
json(res, result);
// 释放连接
connection.release();
});
});
},
delete: function(req, res, next) {
pool.getConnection(function(err, connection) {
var id = +req.query.id;
connection.query(sql.delete, id, function(err, result) {
if (result.affectedRows > 0) {
result = 'delete';
} else {
result = undefined;
}
json(res, result);
connection.release();
});
});
},
update: function(req, res, next) {
var param = req.body;
if (param.name == null || param.age == null || param.id == null) {
json(res, undefined);
return;
}
pool.getConnection(function(err, connection) {
connection.query(sql.update, [param.name, param.age, +param.id], function(err, result) {
if (result.affectedRows > 0) {
result = 'update'
} else {
result = undefined;
}
json(res, result);
connection.release();
});
});
},
queryById: function(req, res, next) {
var id = +req.query.id;
pool.getConnection(function(err, connection) {
connection.query(sql.queryById, id, function(err, result) {
if (result != '') {
var _result = result;
result = {
result: 'select',
data: _result
}
} else {
result = undefined;
}
json(res, result);
connection.release();
});
});
},
queryAll: function(req, res, next) {
pool.getConnection(function(err, connection) {
connection.query(sql.queryAll, function(err, result) {
if (result != '') {
var _result = result;
result = {
result: 'selectall',
data: _result
}
} else {
result = undefined;
}
json(res, result);
connection.release();
});
});
}
};
module.exports = userData;
//json.js
//封装接送模块
var json = function(res, result) {
if (typeof result === 'undefined') {
res.json({
code: '1',
msg: '操作失败'
});
} else if (result === 'add') {
res.json({
code: '200',
msg: '添加成功'
});
} else if (result === 'delete') {
res.json({
code: '200',
msg: '删除成功'
});
} else if (result === 'update') {
res.json({
code: '200',
msg: '更改成功'
});
} else if (result.result != 'undefined' && result.result === 'select') {
res.json({
code: '200',
msg: '查找成功',
data: result.data
});
} else if (result.result != 'undefined' && result.result === 'selectall') {
res.json({
code: '200',
msg: '全部查找成功',
data: result.data
});
} else {
res.json(result);
}
};
module.exports = json;
//poolextent.js
// 连接池扩展封装
var poolextend = function(target, source, flag) {
for (var key in source) {
if (source.hasOwnProperty(key)) {
flag ? (target[key] = source[key]) : (target[key] === void 0 && (target[key] = source[key]));
}
}
return target;
}
module.exports = poolextend;
//sql.js
// SQL语句封裝
var user = {
insert:'INSERT INTO user(id, name, age) VALUES(?,?,?)',
update:'UPDATE user SET name=?, age=? WHERE id=?',
delete: 'DELETE FROM user WHERE id=?',
queryById: 'SELECT * FROM user WHERE id=?',
queryAll: 'SELECT * FROM user'
};
module.exports = user;
//router/index.js
var express = require('express');
var router = express.Router();
var user = require('../modules/handle');
/* GET users listing. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'SQL for MySQL' });
});
router.get('/addUser', function(req, res, next) {
user.add(req, res, next);
});
router.get('/queryAll', function(req, res, next) {
user.queryAll(req, res, next);
}); router.get('/query', function(req, res, next) {
user.queryById(req, res, next);
});
router.get('/deleteUser', function(req, res, next) {
user.delete(req, res, next);
});
router.get('/update', function(req, res, next) {
res.render('update');
});
router.post('/updateUser', function(req, res, next) {
user.update(req, res, next);
});
module.exports = router;
//index.jade
extends layout block content
h1= title
p
a(class={active: currentUrl === '/'} href='/queryAll') 数据查询 p
a(class={active: currentUrl === '/'} href='/query?id=1') 定向查询 p
a(class={active: currentUrl === '/'} href='/addUser?id=0&name=xyz&age=18') 数据插入 p
a(class={active: currentUrl === '/'} href='/update') 数据更新 p
a(class={active: currentUrl === '/'} href='/deleteUser?id=0') 数据删除
p
//layout.jade
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
block content
//update.jade
extends layout
block content
h1 更新用户资料
form(method='post', action='updateUser')
div.form-row
label
span ID:
input(type='text',name='id')
div.form-row
label
span name:
input(type='text',name='name')
div.form-row
label
span age:
input(type='text',name='age')
div.form-row
input(type='submit')

nodejs脚手架express-generator的更多相关文章

  1. NodeJS 框架 Express 从 3.0升级至4.0的新特性

    NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...

  2. npm install Error:EPROTO: protocol error, symlink '../mime/cli.js' -> '/vagrant/src/nodejs/node_modules/express/node_modules/send/node_modules/.bin/mime'

    我在ubuntu上使用npm安装依赖是出现下面错误: npm ERR! Linux 3.13.0-101-genericnpm ERR! argv "/usr/bin/nodejs" ...

  3. [转] NodeJS框架express的途径映射(路由)功能及控制

    NodeJS框架express的路径映射(路由)功能及控制 我们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route co ...

  4. 阿里云主机Nginx下配置NodeJS、Express和Forever

    https://cnodejs.org/topic/5059ce39fd37ea6b2f07e1a3 AngularJS中文社区即运行在阿里云主机上,本站使用Nginx引擎,为了AngularJS,我 ...

  5. nodejs的Express框架源码分析、工作流程分析

    nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...

  6. 知名nodeJS框架Express作者宣布弃nodeJS投Go

    知名 nodeJS 框架 Express 的作者 TJ Holowaychuk 在 Twitter 发推并链接了自己的一篇文章,宣布弃 nodeJS 投 Go. 他给出的理由是:Go 语言和 Rust ...

  7. nodejs下express+ejs环境搭建

    nodejs下express+ejs环境搭建   分类: Nodejs 1.进入需要创建项目的目录    cd F:\nodeCode     2.创建一个带ejs模板工程,工程名为haha    e ...

  8. nodejs库express是如何接收inbound json请求的

    这样几行简单的代码创建一个web服务器: var express = require('express'); var app = express(); var server = require('ht ...

  9. nodejs之express静态路由、ejs

    1.静态路由与ejs使用 /** *1.安装ejs npm install ejs --save-dev * *2.express 里面使用ejs ,安装以后就可以用,不需要引入 * *3.配置exp ...

  10. 使用nodejs和express搭建http web服务

    目录 简介 使用nodejs搭建HTTP web服务 请求nodejs服务 第三方lib请求post 获取http请求的正文 Express和使用express搭建http web服务 express ...

随机推荐

  1. 11.best fields策略(dis_max参数设置)

    主要知识点 常规multi-field搜索结果分析 dis_max参数设置     一.为帖子数据增加content字段     POST /forum/article/_bulk { "u ...

  2. 转:Windows Phone 7 设计简介

    英文原文:smashingmagazine 导读:Windows Phone 7 引进了一个全新的内容管理和用户界面,命名为Metro的设计语言和理论.微软这次所看准的市场和用户群也与之前的老一代 W ...

  3. 6.4.1 标准库 os、os.path 与 shutil 简介

    os模块除了提供使用操作系统功能和访问文件系统的简便方法之外,还提供了大量文件与文件夹操作的方法,如下表所示. 方法 功能说明 access(path,mode) 按照 mode 指定的权限访问文件 ...

  4. C#关键字详解第一节

    abstract:抽象类: 他表达对问题或者实际中的事物,对象等所设计出的抽象概念,比如一个灵感.生物等,这些都是抽像, 但是他们往往也有具体的指向,比如生物圈有人类,猴子,老虎等等,老虎和人类是实际 ...

  5. AIM Tech Round (Div. 2)——ABCD

    http://codeforces.com/contest/624 A.python是用来写div2的AB题的... a, b, x, y = map(float, raw_input().split ...

  6. noip模拟赛 解谜游戏

    题目描述LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画.幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它.老板有一个n*m的矩阵,他想找一个 ...

  7. hdu 4975 最大流解决行列和求矩阵问题,用到矩阵dp优化

    //刚开始乱搞. //网络流求解,如果最大流=所有元素的和则有解:利用残留网络判断是否唯一, //方法有两种,第一种是深搜看看是否存在正边权的环,见上一篇4888 //至少四个点构成的环,第二种是用矩 ...

  8. Fedora15下安装Android开发环境

    Fedora15下安装Android开发环境需要以下步骤: 完整步骤. 1. 安装正确版本的JDK. 2. 安装Eclipse. 3.  安装ADT. 4.  安装Android SDK. 5.  安 ...

  9. Servlet请求参数编码处理(POST & GET)

    小巧,但在中文语境下,还是要注意的. 以下是关键语句,注意转码的先后顺序,这源于GET是HTTP服务器处理,而POST是WEB容器处理: String name = request.getParame ...

  10. asp.net--解决上传文件大小限制

    原文地址 第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点 对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大 ...