2014年4月

1.安装apache。打开终端,可以切换到root模式(下面就不说了,直接写命令)

sudo -s

这是切换到root模式,这里提示要密码,输入密码即可。

sudo apt-get install apache2

这里会自动安装apache,不要关闭终端。等待安装完成。

用firefox打开http://localhost/,提示有“it works”,就是正常工作了。

2.安装php。

sudo apt-get install php5

sudo apt-get install libapache2-mod-php5

sudo /etc/init.d/apache2 restart

测试:sudo gedit /var/www/test.php

写入,然后保存,并用firefox打开 http://localhost/test.php,会显示PHP配置信息就是正确安装了php

3.安装mysql数据库

sudo apt-get install mysql-server

等到弹出密码输入,输入密码

给外部连接mysql的权限http://www.myxzy.com/read.php/279.htm

4.安装MYSQL for Apache HTTP Server

sudo apt-get install libapache2-mod-auth-mysql

sudo apt-get install php5-mysql

要让PHP与MySql一起工作,编辑

sudo gedit /etc/php5/apache2/php.ini

取消对;extension=mysql.so的注释,然后保存文件,最后重启apache

sudo /etc/init.d/apache2 restart

到了这里php+mysql+apache基本安装已经完成。

Update on 2015:  现在 nodemon 已经可以直接支持 Express 4.x 的启动,不在需要进行特殊配置 Update on 2014.04.25: 现在我使用 nodemon 来代替 supervisor 来进行监控任务。 相比 supervisor ,nodemon 的优点包括:更轻量级,内存占用更小。使用更加方便,更容易进行扩展等。 nodemon 的使用方法与 supervisor 相似,

npm install -g nodemon

直接运行nodemon app.js即可,可以随时输入rs回车进行手动重启,非常方便。 更多的使用方法可以在它的 github主页 找到。 Express 4.x 默认将启动模块分离到了./bin/www中,直接使用 supervisor 无法正常监控应用,使得开发过程中的调试非常不方便。 直接在 app.js 添加 app 模块即可。

var debug = require('debug')('my-application'); // debug模块
app.set('port', process.env.PORT || 3000); // 设定监听端口
// Environment sets...
// module.exports = app; 这是 4.x 默认的配置,分离了 app 模块,将它注释即可,上线时可以重新改回来
//启动监听
var server = app.listen(app.get('port'), function() {
 debug('Express server listening on port ' + server.address().port);
});

之后就可以正常的supervisor app.js进行调试了。 如果需要彻底改变启动方式,还需要修改packages.json

"scripts": {
 "start": "node app.js" // 此处将原本的 'node ./bin/www' 改为 'node app.js'
}

之后运行npm start实际就是node app.js了。

Express 3.x 到 4.0 的迁移指南。你可能对这篇文章也有兴趣4.x版中的新功能。 更多的例子和完整的API文档,请参见Express 4.x 的文档

概述

Express 4 不再依赖 Connect 。这意味着所有捆绑的中间件(除了static)都不再能从express模块中被调用。这些中间件都可以作为下面提及的模块进行调用。这一变化是为了让这些中间件在获取修复,更新和发布的同时不影响 express 的发布周期,反之亦然。

其他模块在这里 https://github.com/senchalabs/connect#middleware

移除

app.configure()

这种方法不再可用。如果你想配置基于环境的不同路由,使用 if 语句或替代模块。

app.configure('development', function() {
 // configure stuff here
});
// 现在改为
var env = process.env.NODE_ENV || 'development';
if ('development' == env) {
 // configure stuff here
}

app.router

这个中间件已经全面改版,以此避免.use.get之间的混淆(或者是其他HTTP动作),同时,不再需要手动声明的app.use(app.router)(已被移除)。查看下面关于新的中间件和路由 API 的一节。 如果你的代码看起来像这样:

app.use(cookieParser());
app.use(bodyParser());
/// 其他的中间件,并没有影响
app.use(app.router); // <--- 这行会被移除
// 更多的中间件(在路由之后执行)
app.use(function(req, res, next);
// 处理错误的中间件
app.use(function(err, req, res, next) {});
app.get('/' ...);
app.post(...);

app.router已被移除,中间件和路由按照它们添加的顺序被执行。在你的代码中,你应该将原本在app.use(app.router)之后的向app.use的请求移动到其他路由之后(HTTP动作)。

app.use(cookieParser());
app.use(bodyParser());
/// 其他的中间件,并没有影响
app.get('/' ...);
app.post(...);
// 更多的中间件(在路由后执行)
app.use(function(req, res, next);
// 处理错误的中间件
app.use(function(err, req, res, next) {});

express.createServer()

长期弃用。现在只要使用`express()’创建一个新的应用。

connect 中间件

除了express.static为了便捷性直接封装在 express 中,其他所有 connect 的中间件都被分离到了独立的模块中。由此,每个独立的模块都可以拥有自己的版本控制。

connect 的补丁

Connect 对 node 的原型进行了全局的改动。 这被认为是不正确的,所以在 Connect 3 中已被移除。 其中一些补丁是:

  • res.on('header')
  • res.charset
  • res.headerSent – use node’s res.headersSent instead

你不应该在任何 Connect 或 Express 的库中再使用这些。

res.charset

如果你想快速设置默认的字符集(你确实应该这么做), 使用 res.set('content-type') 或者 res.type() 来设置 header 。 当使用res.setHeader()时,默认的字符集将不会添加。

改动

app.use

app.use 现在可以接受 :params.

app.use('/users/:user_id', function(req, res, next) {
 // req.params.user_id 可以正确获取
});

req.accepted()

使用req.accepts()来代替。

  • req.accepts()
  • req.acceptsEncodings()
  • req.acceptsCharsets()
  • req.acceptsLanguages()

都在内部使用 accepts。 请参考accepts来提交问题或者查看文档。 请注意,这些属性可能已经从数组改为函数。 要把它们作为“数组”使用,只要不向它们传递任何参数即可。 例如, req.acceptsLanguages() // => ['en', 'es', 'fr'].

res.location()

不再做相对路径的 URL 解析。浏览器自身将处理相对路径的 URL 。

app.route -> app.mountpath

当把一个 express 应用安装到另一个 express 应用中时。

配置改动

  • json spaces 在开发模式下不再默认启用。

req.params

现在它是一个对象而不是数组。如果你以前使用req.params[##]的形式,这不会破坏你的应用,它可以在不知道参数名的情况下,使用正则来处理路由。

res.locals

不再是一个函数。现在这是一个普通的JS对象。所以把它当作普通的对象来处理。

res.headerSent

改为headersSent来匹配 node.js 的 ServerResponse 对象。你的应用可能并没有使用到这个,因此它不会是一个问题。

req.is

现在在内部使用 type-is。 请参考type-is来提交问题或者查看文档。

新加入

app.route(path)

返回一个新的Route的实例。当收到和这个路由的path相匹配的请求时,这个路由就会被调用。路由可以有自己的中间件和针对 HTTP 动作的方法来处理请求。 请参阅路由和路由线路文档,以便更好地了解如何在 express 中创建路由。

Router 和 Route 中间件

Router 已经全面改版,现在它是一个功能完善的中间件路由。Router 是在不牺牲参数匹配和中间件的情况下,将你的路由分离到多个文件或者模块的好方法。请参阅 Routes 及路由文档 。

The Rubik's Cube is the most popular puzzle on the World. Learn how to solve it with the easiest method.

更多的例子和完整的API文档,请参见Express 4.x 的文档。你可能对这篇文章也有兴趣 从3.x 迁移到 4.x版

移除了捆绑的中间件

Express 中不再捆绑 Connect 提供的中间件(或者说显示在 “express” 模块中)。你要使用的任何中间件应额外安装并在你的应用的 package.json 中列出。这方便了中间件的功能修复和快速更新,同时避免影响 express 的核心功能。

参见中间件模块,这张列表完整的列出了旧的 connect 中间件。

Router 的改进

express 现在提供了一个更好的“ Router ”功能以及路由 API ,来解决重复性的路由命名情况,并且更容易将路由分解到多个文件,方便项目组织和管理。

不再需要 app.use(app.router)

所有的路由功能都将按照它们出现的顺序被添加。你

不用

再使用app.use(app.router)。这解决了 Express 最常见的问题。

换句话说,混合的app.use()app[VERB]()

确切地

按照它们的调用顺序工作。

app.get('/', home);
app.use('/public', require('st')(process.cwd()));
app.get('/users', users.list);
app.post('/users', users.create);

app.route(path)

取代了原本的app.get()app.post()等方式(但这些依然可以使用),提供了一个新的route()功能,它会返回一个可被使用的Route实例。然后,你可以在这个实例中调用所有的 HTTP 动作,甚至可以添加具体的中间件到这个路由中。

app.route('/users')
.get(function(req, res, next) {})
.post(function(req, res, next) {})

route()需要一个path路径参数,这个参数和你创建一个路由时传递给.get()或者.post()的参数相同。

此外,返回的路由有一个.all()方法,如果你想添加中间件到这个路由中,或处理所有的动作,这会很有帮助。

Router(路由)

另一项新增功能是 express 的Router的公共API。一个Router就像是一个小型的 express 应用。它不包含任何 view 或者 setting,但是确实提供了典型的路由API(.use.get.param.route)。

应用和路由也可以通过.use()方法使用其它路由,这允许你通过多个文件来建立路由,以更好地组织你的应用。

想象一下,在你的项目的一个例子routes/people.js

var people = express.Router();

people.use(function(req, res, next) {
});

people.get('/', function(req, res, next) {
});

module.exports.people = people;

您可以将其安装在/people路径下,这样的话,向/people/*的任何请求都将被发送到 people 路由。

app.use('/people', require('./routes/people').people);

更多的例子参见路由器文档

设置:

app.use(express.methodOverride());
app.use(express.bodyParser({uploadDir: "public/images",keepExtensions: true}));

bodyParser设置项一定要紧跟在 methodOverride后面,同时 uploadDir参数的目录需要手动创建。

表单上传:

使用表单上传时,需要给 <Form> 添加参数 enctype="multipart/form-data"

FormData & jQuery.ajax:

使用 FormData 结合 jQuery.ajax 方式上传时

var formData = new FormData();
formdata.append('file', files);
var uploadURL = '/upload';
$.ajax({
 url: uploadURL,
 type: 'POST',
 contentType: false,
 processData: false,
 cache: false,
 data: formData,
 success: function (data) {
 console.log(data);
 }
});

contentType: false, processData: false 需要设置