Gowhich

Durban's Blog

对于koa2.0.0的表单提交如何处理,也是费了我很久的时间,在多次尝试与研究之下,可以这样来处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
proxy.post('/admin/:path', (ctx, next) => {
const url = ctx.config.hostDomain + '/admin/' +ctx.params.path;
const options = {
timeout: ctx.config.httpTimeout,
method: ctx.request.method,
headers: ctx.request.headers,
data: ctx.request.body
};
return next().then(() => {
const request = urllib.request(url, options);
return request.then( (data) => {
ctx.body = data.data.toString()
});
}).catch((err) => {
console.log(err);
});
});

我这里只是做了一个接口的调用,其实最重要的是在获得request后如何去进行对应的promise的操作和获取结果,这里其实很简单的:

1
2
3
4
5
6
7
8
return next().then(() => {
const request = urllib.request(url, options);
return request.then( (data) => {
ctx.body = data.data.toString()
});
}).catch((err) => {
console.log(err);
});

注意这里的两个return操作,做完request的操作后,直接在开头进行一个return操作就可以了,这样body的值也回调过去了。

针对koa2.0.0的测试版本,在使用的过程中遇到了很多的问题,这篇文章讲解一下如何进行操作html的调用和静态文件的调用

因为koa2.0.0版本的升级,很多的中间件都没有跟随着一起调整,所以有些中间件就出现了很多问题,这里说的就是针对试图文件的调用渲染和静态文件的调用

视图文件的调用使用的是如下的中间件:koa-swig

安装koa-swig:

1
cnpm install koa-swig --save

配置如下:

1
2
3
4
5
6
app.context.render = co.wrap(render({
root: path.join(__dirname, 'dest'),
autoescape: true,
cache: 'memory', // disable, set to false
ext: 'html'
}));

路由中调用的方式如下:

1
2
3
4
5
router.get('/home', (ctx, next) => {
return next().then(() => {
ctx.render('index.html');
});
});

这里到这里就解决了视图调用的问题,访问的时候如果页面中调用的是本地的js或者css的话,会包404的错误,就是找不到对应的路由,OK,下面记录下。

这里调用得了两个中间件:koa-convert,koa-static

1
2
const convert = require('koa-convert');
const serve = require('koa-static');

安装这两个中间件:

1
cnpm install koa-static koa-convert --save

对应的配置如下:

1
app.use(convert(serve(__dirname + '/dest')));

这里就是很简单了,刚开始的时候是无效的,后来在github上问了一下,就找打了解决办法。可以到这里看下:https://github.com/koajs/static/issues/59

好了,到这里两个部分的操作就完成了。

薪资水平查询,不同地区的薪资水平查询地址:

http://beijing.baicai.com/salary-IOS%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88/

下面我来分析一下这个地址如何使用【对于程序员】

http://{address}.baicai.com/salary-{position}/

address:对应地区的拼音【shanghai,beijing】

position:对应职位【IOS工程师,Android工程师】

就这些自己去对应查吧,我就不提供接口了

为啥npm安装的时候devDependencies这里面的代码也安装了,琢磨了好久,也搜索了很久,终于找到了答案,哈哈。其实觉得npm还是蛮智能的,只是自己比较低能了,没看npm的源码,测试结果是让我觉得,npm会根据NODE_ENV的环境变量值,来判断你当前的环境是开发环境和生产环境,然后根据环境来安装对应的依赖包。

解决方式就是:

1
2
export NODE_ENV=production
npm install --save

这样就会很快的将dependencies里面的包安装了,就会自动忽略掉devDependencies里面的依赖包了,就这么简单。

最近koajs更新了一个很重要的版本,就是2.0.0,虽然这个版本是一个还在开发中的版本,但是已经可以下载使用了,当然,我用来下,唉,遗憾的是,虽然koa更新了,但是对应的中间插件并没有更新,这个是为什么呢,其他中间件的人不积极呗,只能试用了下,最重要的一个就是,Router这个中间件,既然也没有更新,不兼容最新版本的koa,好吧,还有在issue中发现了两点,已经有人根据koa-router,自己写了一个koa-66,使用完还不错,下面正式记录一下:

安装 [email protected]

1
cnpm install koa@2.0.0-alpha.2 --save

安装koa-66

1
cnpm install koa-66 --save

安装完了看个示例吧,app.js代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'use strict';
const Koa = require('koa');
const app = new Koa();
const co = require('co');
const Router = require('koa-66');
// const router = new Router();
const mountRouter = new Router();
const Controller = require('./router');
app.use((ctx, next) => {
const start = new Date;
return next().then(() => {
const ms = new Date - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}`);
});
});
// app.use((ctx) => {
// ctx.body = 'Hello World!';
// });
mountRouter.mount('/blog', Controller.router);
app.use(mountRouter.routes());
app.listen(3002);

router.js代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Created by durban on 15/10/17.
*/
const Router = require('koa-66');
const router = new Router();
router.get('/home', (ctx, next) => {
return next().then(() => {
console.log(ctx);
console.log(ctx.req);
ctx.body = 'Router Hello World!';
});
});
router.get('/views/:id', (ctx,next) => {
return next().then(() => {
console.log(ctx.params);
ctx.body = 'views';
});
});
router.get('/about', (ctx, next) => {
return next().then(() => {
ctx.body = 'about';
});
});
module.exports.router = router;

好了,运行app.js,开始测试吧,终于搞定了router的代码不用跟app.js写在一起了。

当然这里的node版本是最新的版本v4.2.1。

这个可以通过colgroup来控制单元格的宽度,如果只定义部分宽度,其他的单元格会自适应的调整。

实例代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<thead>
<colgroup>
<col></col>
<col></col>
<col></col>
<col></col>
<col></col>
<col width='20%'></col>
<col></col>
<col></col>
</colgroup>
<tr>
<th>用户名称</th>
<th>登录方式</th>
<th>联系方式</th>
<th>内容</th>
<th>客户端</th>
<th>备注</th>
<th>最后记账时间</th>
<th>操作</th>
</tr>
</thead>

为了加强Linux的安全,修改linux的root的登录名会给系统带来额外的保护

操作只需要三步就可以搞定

第一步:修改 /etc/passwd

1
vi /etc/passwd

按i键进入编辑状态

修改第1行第1个root为新的用户名

按esc键退出编辑状态,并输入:wq!保存并退出

第二步:修改 /etc/shadow

1
vi /etc/shadow

按i键进入编辑状态

修改第1行第1个root为新的用户名

按esc键退出编辑状态,并输入:wq!强制保存并退出

第三步: 修改 /etc/sudoers

运行

1
vi /etc/sudoers

找到root ALL=(ALL) ALL

在下面添加一行:

1
新用户名    ALL=(ALL)       ALL

:wq!保存退出

为了保险起见自己可以另开一个console窗口试试

为了在两台服务器之间转移数据库,这里只需要三个步骤

第一步:执行Mysql的 Dump

1
mysqldump -u root -p --opt [database name] > [database name].sql

第二步:copy数据库文件到另外一台服务器

这里使用SCP命令,而且SCP有如下的使用语法

1
scp [database name].sql [username]@[servername]:path/to/database/

这里简单举一个例子,如下:

1
scp newdatabase.sql [email protected]:~/

第三步:导入数据库

1
mysql -u root -p newdatabase < /path/to/newdatabase.sql

你的数据库就通过SCP完成了转移

一、对于静态页(就是通过meta标签来设置):

1
2
<!--expires用于设定网页的过期时间,一旦过期就必须从服务器上重新加载.时间必须使用GMT格式-->
<meta http-equiv="expires" content="Sunday 26 October 2008 01:00 GMT" />

或者通过pragma no-cache来设置,pragma出现在http-equiv属性中,使用content属性的no-cache值表示是否缓存网页(为了提高速度一些浏览器会缓存浏览者浏览过的页面,通过下面的定义,浏览器一般不会缓存页面,而且浏览器无法脱机浏览)。

1
<meta http-equiv="pragma" content="no-cache" />

二、对于ASP页面:

1
2
3
4
5
<%
Response.Buffer=true
Response.CacheControl="no-cache" '禁止代理服务器缓存本页面
Response.Expires=-1000 '让页面立即过期(这儿最好设置一个绝对值较大的负数)
%>

三、对于JSP页面:

1
2
3
4
5
6
7
8
9
<%
if(request.getProtocol().compareTo("HTTP/1.0")==0){
response.setHeader("Pragma","no-cache");
}
if(request.getProtocol().compareTo("HTTP/1.1")==0){
response.setHeader("Cache-Control","no-cache");
}
response.setDateHeader("Expires",0);
%>

四、对于PHP页面

1
2
3
4
<?php 
header('Cache-Control:no-cache,must-revalidate');
header('Pragma:no-cache');
?>

强调说明:对于动态页面,缓存的代码必须放在任何HTML标签输出之前,否则将会出错。

使用node的express或connect作为server来启动项目的如何去设置webpack-dev-server

这里举例子说明【为这里使用的是connect,express同理】,三个文件

1
2
3
development.js  //启动文件
webpack.config.development.js //开发模式的配置文件
webpack.dev.server.js //webpack-dev-server 启动的辅助文件

先来看development.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
'use strict';
var http = require('http');
var connect = require('connect');
var urllib = require('urllib');
var staticServe = require('serve-static');
var finalhandler = require('finalhandler');
var debug = require('debug')('proxy');
var args = require("tinyclap")(); // 启动参数parser
var proxy = require('proxy-middleware');
var path = require('path');
var url = require('url');
var bodyParser = require('body-parser');
var app = connect();
//=====================配置阶段
var config = require('./config');
if (args.argv && args.argv['f']) {
config = require(args.argv['f']);
}
var stServe = staticServe('./app', {index: 'index.html'});
app.use(bodyParser.urlencoded({extended: false}));
//这里是主要的
// Any requests to localhost:3000/build is proxied
// to webpack-dev-server
require('./webpack.dev.server')(app);
//=====================启动阶段
app.use(function(req, res) {
var done = finalhandler(req, res);
stServe(req, res, done);
});
http.createServer(app).listen(config.port);
console.log('Server listen on port %d.', config.port);

这里

1
require('./webpack.dev.server')(app);

是关键

再来看webpack.config.development.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'use strict';
var path = require("path");
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var webpack = require('webpack');
var bower_components_dir = path.join(__dirname, 'app/js/bower_components');
module.exports = {
devtool:'eval',
entry: {
'main':[
"webpack/hot/dev-server",
'webpack-dev-server/client?http://127.0.0.1:8080',
'./app/js/index.js'
] //演示单入口文件
},
output: {
path: path.join(__dirname, 'app/js/out'), //打包输出的路径
filename: '[name].js', //打包后的名字
publicPath: "/js/out/" //html引用路径,在这里是本地地址。
},
plugins: [
new webpack.optimize.CommonsChunkPlugin('common.js'),
new ExtractTextPlugin("styles.css"),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
],
// 新添加的module属性
module: {
loaders: [
{test: /\.es6$/, exclude: /bower_components/, loader: "babel"},
{test: /\.jsx?$/, exclude: /bower_components/, loader: "jsx-loader?insertPragma=React.DOM&harmony"}
]
}
};

这里主要是entry部分和output部分

接下来再看webpack.dev.server.js;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'use strict';
var webpack = require('webpack');
var WebpackDevServer = require('webpack-dev-server');
var config = require('./webpack.config.development');
var proxy = require('proxy-middleware');
var url = require('url');
var urllib = require('urllib');
var debug = require('debug');
module.exports = function(app) {
//异步 静态文件
app.use('/js/out', proxy('http://127.0.0.1:8080/js/out'));
var server = new WebpackDevServer(webpack(config), {
publicPath: config.output.publicPath,
hot: true,
noInfo: false,
historyApiFallback: true,
stats: { colors: true },
headers: { 'Access-Control-Allow-Origin': '*' }
}).listen(8080, '127.0.0.1', function(err,result) {
if (err) {
console.log(err);
}
console.log('Webpack Listening at 127.0.0.1:8080');
});
}

这里主要是函数区域部分,做了一个proxy处理,将所有的js和css文件转到webpack-dev-server服务端

最后index.html文件里面的js和css静态文件照常处理就好,只要能解析到/js/out上面就好

0%