在使用Node.js之前,你需要安装它。 安装过程非常简单,如果你使用windows或者OS x,nodejs.org提供了不同操作系统下的安装包,对于Linux来说,你可以使用任何的打包工具。打开你的终端,输入:
sudo apt-get update sudo apt-get install node
或者:
sudo aptitude update sudo aptitude install node
Node.js位于sid repositories,你可以添加它们到你的列表里:
sudo echo deb http://ftp.us.debian.org/debian/ sid main > /etc/apt/sources.list.d/sid.list
注意在旧系统中安装sid包可能会破坏你的系统。所以当心,安装完node后请移除/etc/apt/sources.list.d/sid.list
Node.js拥有一个包管理器,叫做Node Package Manager(NPM)。自动随node.js安装,你可以使用NPM来安装模块。执行如下语句:
npm install module_name
不管你使用何种OS,上面语句会安装指定的模块名称
很自然,我们第一个Node.js脚本将打印Hello world到控制台。如下:
console.log('Hello World, GBin1!');
我们保存以上脚本为hello.js。打开终端/命令行,找到hello.js,执行如下:
node hello.js
你应该在控制台看到'hello world, GBin1!'字样。
下面我们开发一个更复杂的应用,当让也不是那么复杂。请先看看如下代码http.js:
// Include http module. var http = require("http"); // Create the server. Function passed as parameter is called on every request made. // request variable holds all request parameters // response variable allows you to do anything with response sent to the client. http.createServer(function (request, response) { // Attach listener on end event. // This event is called when client sent all data and is waiting for response. request.on("end", function () { // Write headers to the response. // 200 is HTTP status code (this one means success) // Second parameter holds header fields in object // We are sending plain text, so Content-Type should be text/plain response.writeHead(200, { 'Content-Type': 'text/html' }); // Send data and end response. response.end('Welcome to <a href="http://www.gbin1.com">GBin1.com</a>!'); }); // Listen on the 8080 port. }).listen(8080);
代码其实并不复杂,你可以看到我们使用response.write()将数据传递到客户端,当然必须在response.end()之前调用。保存代码,然后在控制台执行:
node http.js
打开任何浏览器,输入http://localhost:8080,你可以看到"Welcome to GBin1.com!"出现在页面上。
正如前面我们提到的,我们需要自己处理Node.js中的任何东西,包括处理参数,其实非常简单,如下:
// Include http module, var http = require("http"), // And url module, which is very helpful in parsing request parameters. url = require("url"); // Create the server. http.createServer(function (request, response) { // Attach listener on end event. request.on('end', function () { // Parse the request for arguments and store them in _get variable. // This function parses the url from request and returns object representation. var _get = url.parse(request.url, true).query; // Write headers to the response. response.writeHead(200, { 'Content-Type': 'text/plain' }); // Send data and end response. response.end('Here is your data: ' + _get['data']); }); // Listen on the 8080 port. }).listen(8080);
这个代码使用url模块的parse()方法,来将请求的URL转换为一个对象。返回的对象拥有一个query属性,可以用来取得URL参数。保存这段代码为get.js并且执行:
node get.js
打开浏览器并且输入地址http://localhost:8080/?data=put_gbstring_here。你将看到效果。
我们在node.js中使用fs模块来管理文件。使用fs.readFile()和fs.writeFile()方法来读取和写入文件,请看如下代码:
// Include http module, var http = require("http"), // And mysql module you've just installed. fs = require("fs"); // Create the http server. http.createServer(function (request, response) { // Attach listener on end event. request.on("end", function () { // Read the file. fs.readFile("test.txt", 'utf-8', function (error, data) { // Write headers. response.writeHead(200, { 'Content-Type': 'text/plain' }); // Increment the number obtained from file. data = parseInt(data) + 1; // Write incremented number to file. fs.writeFile('test.txt', data); // End response with some nice message. response.end('This page was refreshed ' + data + ' times!'); }); }); // Listen on the 8080 port. }).listen(8080);
将以上代码保存为file.js,然后创建一个test.txt文件到同一个目录下。
代码展示如何使用fs.readFile()和fs.writeFile()。每一次服务器收到一个请求,脚本就会自动添加1,然后写回文件。fs.readFile()方法接受3个参数:文件名称,编码,callback方法。
写入文件,在这个例子中,非常简单。我们不需要等待任何结果,虽然你仍旧处理错误。fs.writeFile()方法接受文件名称和数据作为参数。同时接受第三个和第四个参数(都是可选的)来指定编码和callback方法。运行脚本:
node files.js
打 开浏览器,输入http://localhost:8080,刷新页面几次。看看结果好像有bug,这里每次加了2。其实这不是一个错误。每一次你请求这 个URL的时候,俩个请求被发送到服务器。第一个请求是浏览器自动请求的 favion.ico。当然第二个请求是我们脚本对应URL(http://localhost:8080)
为了解决这个问题,我们修改代码如下:
// Include http module, var http = require("http"), // And mysql module you've just installed. fs = require("fs"); // Create the http server. http.createServer(function (request, response) { // Attach listener on end event. request.on('end', function () { // Check if user requests / if (request.url == '/') { // Read the file. fs.readFile('test.txt', 'utf-8', function (error, data) { // Write headers. response.writeHead(200, { 'Content-Type': 'text/plain' }); // Increment the number obtained from file. data = parseInt(data) + 1; // Write incremented number to file. fs.writeFile('test.txt', data); // End response with some nice message. response.end('This page was refreshed ' + data + ' times!'); }); } else { // Indicate that requested file was not found. response.writeHead(404); // And end request without sending any data. response.end(); } }); // Listen on the 8080 port. }).listen(8080);
现在看看,结果是不是正确了。
对 于一个正常的服务器端技术,肯定需要有机制来处理数据库操作。为了在node.js中使用数据库,我们需要安装类库,这里我们使用node-mysql。 完整的名称是[email protected](@后面是版本号)。打开你的控制台,导航到你保存脚本的目录,执行如下命令:
npm install [email protected]
这将下载和安装模块,同时创建node_module目录到目前目录中。下面我们看看如何使用代码访问mysql:
// Include http module, var http = require('http'), // And mysql module you've just installed. mysql = require("mysql"); // Create the connection. // Data is default to new mysql installation and should be changed according to your configuration. var connection = mysql.createConnection({ user: "root", password: "", database: "db_name" }); // Create the http server. http.createServer(function (request, response) { // Attach listener on end event. request.on('end', function () { // Query the database. connection.query('SELECT * FROM your_table;', function (error, rows, fields) { response.writeHead(200, { 'Content-Type': 'x-application/json' }); // Send data as JSON string. // Rows variable holds the result of the query. response.end(JSON.stringify(rows)); }); }); // Listen on the 8080 port. }).listen(8080);
查 询数据库非常简单,输入查询语句和callback方法。在一个实际的应用中,你应该检查是否有错误!(一旦有错误,error参数将不会为 undefined),并且发送响应代码基于查询成功或者失败,注意我们设定content-type为x-application/json,这是正确 的JSON MIME类型。rows参数包含了查询结果,这里我们使用JSON,stringify()方法简单的将rows中的数据转换为JSON结构
保存脚本为mysql.js,执行:
node mysql.js
在浏览器中输入http://localhost:8080,你可以看到要求你下载JSON格式数据文件。