node.js 入门示例

在开始学习node.js之前,先让我们简单了解一下node.js。

node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,目的是为了撰写可扩充网络程序,如Web服务。与一般JavaScript不同的是,node.js并不在Web浏览器上运行,而是一种在服务器上运行的JavaScript环境。

下面让我们以几个简单的示例作为node.js的入门教程。

示例1:编写一个应用程序,该程序接收一个或多个命令行参数,并在控制台输出参数之和。

我们可以通过全局对象process访问命令行参数,process有一个argv属性,该属性是一个数组并且包含了完整的命令行,那么命令行参数应该从下标2开始。

var result = 0

for (var i = 2; i < process.argv.length; i++)
  result += Number(process.argv[i])

console.log(result)
示例2:编写一个应用程序,该程序同步读取一个文件,并输出文件的行数,文件的路径将作为命令行的第一个参数传入。

node.js通过fs模块执行文件系统操作,所以我们需要在代码中引入fs模块(node.js的核心模块),fs.readFileSync(filename[,options])以同步的方式读取文件,并返回文件的内容。注意返回的文件内容是一个Buffer对象,我们可以通过buf.toString()方法轻松将内容转换为字符串。为了计算文件内容的行数,我们可以通过调用split('\n')将文件内容拆分为一个数组,数组的每一项为文件的每一行,这里注意linux和windows的区别,linux系统在文件的结尾处有一个换行符,也就意味着文件的行数为数组的长度减去1,windows在文件的结尾处有一个EOF文件结束符,所以文件的行数即为数组的长度。

var fs = require('fs')

var contents = fs.readFileSync(process.argv[2])
var lines = contents.toString().split('\n').length
console.log(lines)

示例3:编写一个应用程序,该程序异步读取一个文件,并输出文件的行数,文件的路径将作为命令行的第一个参数传入。

该示例的解决方式基本与示例2相同,只不过你需要以异步的方式读取文件内容,请注意异步是node.js的一个重要特性。在这里我们需要使用fs.readFile(filename[,options],callback)方法,该方法以异步的方式读取文件的内容。callback方法有两个参数,第一个参数error表示有无错误发生,第二个参数data则代表读取的文件内容。

var fs = require('fs')
var file = process.argv[2]

fs.readFile(file, function (err, contents) {
  // fs.readFile(file, 'utf8', callback) can also be used
  var lines = contents.toString().split('\n').length - 1
  console.log(lines)
})
示例4:编写一个应用程序,该程序输出指定目录下面指定类型的文件名称列表,目录名称和文件类型分别是命令行的第一和第二个参数, 在这里需要使用fs.readdir(path,callback)方法。

var fs = require('fs')
var path = require('path')

fs.readdir(process.argv[2], function (err, list) {
  list.forEach(function (file) {
    if (path.extname(file) === '.' + process.argv[3])
      console.log(file)
  })
})
示例5:与示例4问题相同,只是在这里你需要编写自己的module,该module暴露唯一一个接口,该接口接收三个参数,第一个参数为目录名,第二个为文件类型,最后一个为回调函数。

solution-filter.js

var fs = require('fs')
var path = require('path')

module.exports = function (dir, filterStr, callback) {

  fs.readdir(dir, function (err, list) {
    if (err)
      return callback(err)

    list = list.filter(function (file) {
      return path.extname(file) === '.' + filterStr
    })

    callback(null, list)
  })
}
solution.js

var filterFn = require('./solution_filter.js')
var dir = process.argv[2]
var filterStr = process.argv[3]

filterFn(dir, filterStr, function (err, list) {
  if (err)
    return console.error('There was an error:', err)

  list.forEach(function (file) {
    console.log(file)
  })
})
示例6:编写一个应用程序,该程序向指定的地址发送一个 HTTP GET请求,并输出请求的结果。

在这里我们需要使用http模块,http.get(options[,callback])方法是node为大家提供的一个简便的http请求方式,在这里我们将使用该方法来简化我们的程序。

var http = require('http')

http.get(process.argv[2], function (response) {
  response.setEncoding('utf8')
  response.on('data', console.log)
  response.on('error', console.error)
})
示例7:编写一个TCP时间服务,该服务监听某个指定的端口,对于每一次连接以指定的格式(YYYY-MM-DD hh:mm)返回当前时间。

在这里我们需要使用net模块来创建一个TCP服务器,该服务器监听指定的端口,端口作为命令行的第一个参数传入。

var net = require('net')

function zeroFill(i) {
  return (i < 10 ? '0' : '') + i
}

function now () {
  var d = new Date()
  return d.getFullYear() + '-'
    + zeroFill(d.getMonth() + 1) + '-'
    + zeroFill(d.getDate()) + ' '
    + zeroFill(d.getHours()) + ':'
    + zeroFill(d.getMinutes())
}

var server = net.createServer(function (socket) {
  socket.end(now() + '\n')
})

server.listen(Number(process.argv[2]))
示例8:编写一个http服务,该服务监听一个指定的端口,并为每一次连接返回指定文件的内容,端口作为第一个命令行参数传入,文件名称是第二个命令行参数。

在这里我们需要使用createReadStream(filename[,options])方法,该方法返回一个新的readStream对象,并将返回结果传入到响应(res)当中

var http = require('http')
var fs = require('fs')

var server = http.createServer(function (req, res) {
  res.writeHead(200, { 'content-type': 'text/plain' })

  fs.createReadStream(process.argv[3]).pipe(res)
})

server.listen(Number(process.argv[2]))
示例9:编写一个http服务,该服务只处理post请求,并将接收的字符内容转换为大写形式返回。

npm当中有许多可供使用的包来帮助我们转换流数据,在这里我们使用through2-map包,在使用之前我们需要运行命令npm install through2-map来下载包。

var http = require('http')
var map = require('through2-map')

var server = http.createServer(function (req, res) {
  if (req.method != 'POST')
    return res.end('send me a POST\n')

  req.pipe(map(function (chunk) {
    return chunk.toString().toUpperCase()
  })).pipe(res)
})

server.listen(Number(process.argv[2]))
示例10:编写一个http服务,该服务能够根据不同的请求返回指定的JSON数据,如果请求为:"api/parsetime?iso=2013-08-10T12:10:15.474Z",则返回一个JSON对象,该对象包含hour、minute、second三个字段,如果请求地址为:“api/unixtime ?iso=2013-08-10T12:10:15.474Z”,则返回一个JSON对象,该对象只包含一个字段unixtime。

var http = require('http')
var url = require('url')

function parsetime (time) {
  return {
    hour: time.getHours(),
    minute: time.getMinutes(),
    second: time.getSeconds()
  }
}

function unixtime (time) {
  return { unixtime : time.getTime() }
}

var server = http.createServer(function (req, res) {
  var parsedUrl = url.parse(req.url, true)
  var time = new Date(parsedUrl.query.iso)
  var result

  if (/^\/api\/parsetime/.test(req.url))
    result = parsetime(time)
  else if (/^\/api\/unixtime/.test(req.url))
    result = unixtime(time)

  if (result) {
    res.writeHead(200, { 'Content-Type': 'application/json' })
    res.end(JSON.stringify(result))
  } else {
    res.writeHead(404)
    res.end()
  }
})
server.listen(Number(process.argv[2]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值