Node.js 入门:就是运行在服务端的 JavaScript

346 阅读4分钟

简介

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

简单的说 Node.js 就是运行在服务端的 JavaScript。

详细学习: 菜鸟教程

一、快速入门

Hello World

新建js文件 helloworld.js

console.log("hello world!");

终端执行文件(需在文件所在目录下执行)

node helloworld.js

实现简易HttpServer

新建js文件server.js

var http = require('http');

http.createServer(function (request, response) {
    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

终端执行文件(需在文件所在目录下执行)

node server.js 

关闭nodejs服务

在终端按Ctrl+C

二、NPM包管理器

1. 基本信息

简介

NPM官方网站

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。

  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。

  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

检查安装

由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。可以通过输入 "npm -v" 来测试是否成功安装,出现版本提示表示安装成功。

$ npm -v
2.3.0

npm 升级

Linux系统环境升级

$ sudo npm install npm -g

Windows系统环境升级

npm install npm -g

2. 基本应用

2.1 安装模块

npm 安装 Node.js 模块语法格式如下:

$ npm install <Module Name>

以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:

$ npm install express

安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。

var express = require('express');

2.2 卸载模块

可以使用以下命令来卸载 Node.js 模块。

$ npm uninstall express

卸载后,可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:

$ npm ls

2.3 更新模块

可以使用以下命令更新模块:

$ npm update express

2.4 搜索模块

可以使用以下来搜索模块:

$ npm search express

2.5 生成package文件

使用npm快速生成package.json(类似pom.xml)

npm init //根据提示作一些设定

{
  "name": "nodedemo",//工程名
  "version": "1.0.0",//版本号
  "description": "npm测试",//描述
  "main": "HelloWorld.js",//入口js
  "scripts": { //运行脚本
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "Hyman",//开发者
  "license": "ISC"//授权协议
}

三、连接Mysql

安装mysql模块

npm install mysql

简单样例

新建测试文件MysqlTest.js

var mysql  = require('mysql');  

var connection = mysql.createConnection({     
  host     : 'localhost',       
  user     : 'root',              
  password : '123456',       
  port: '3306',                   
  database: 'test' 
}); 

connection.connect();

var  sql = 'SELECT * FROM user';
//查(无参写法)
connection.query(sql,function (err, result) {
        if(err){
          console.log('[SELECT ERROR] - ',err.message);
          return;
        }
       console.log('--------------------------SELECT----------------------------');
       console.log(result);
       console.log('------------------------------------------------------------\n\n');  
});

var now = new Date();
var Sql = 'INSERT INTO user(Id,name,mail,update_date,create_date) VALUES(0,?,?,?,?)';
var SqlParams = ['李四', 'lisi@mail.com',now, now];
//增(有参写法)
connection.query(Sql,SqlParams,function (err, result) {
        if(err){
         console.log('[INSERT ERROR] - ',err.message);
         return;
        }        
       console.log('--------------------------INSERT----------------------------');
       //console.log('INSERT ID:',result.insertId);        
       console.log('INSERT ID:',result);        
       console.log('-----------------------------------------------------------------');  
});
connection.end();

注意事项

1、不要把测试文件命名为mysql.js

2、出现以下错误

[SELECT ERROR] -  ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading
MySQL client

错误原因:最新的mysql模块并未完全支持MySQL 8的“caching_sha2_password”加密方式,而“caching_sha2_password”在MySQL 8中是默认的加密方式。

解决方案:更改Mysql加密方式

USE mysql;
--root为数据库用户,123456为用户对应密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

四、编写RESTful API

创建一个 json 数据资源文件 users.json

   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },
   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },
   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
}

创建RESTful API 的文件server.js

var express = require('express');
var app = express();
var fs = require("fs");

//获取用户清单
app.get('/listUsers', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
       console.log( data );
       res.end( data );
   });
})

var user = {
    "user4" : {
       "name" : "mohit",
       "password" : "password4",
       "profession" : "teacher",
       "id": 4
    }
 }

 //添加的新用户数据
 app.get('/addUser', function (req, res) {
    // 读取已存在的数据
    fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
        data = JSON.parse( data );
        data["user4"] = user["user4"];
        console.log( data );
        res.end( JSON.stringify(data));
    });
 })

 //删除对应用户
 app.get('/deleteUser/:id', function (req, res) {
    fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
        data = JSON.parse( data );
        delete data["user" + req.params.id];
        console.log( data );
        res.end( JSON.stringify(data));
    });
 })

//根据输入id返回结果,需要放在最后,避免干扰前面的路由
app.get('/:id', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
    data = JSON.parse( data );
    var userTemp = data["user" + req.params.id] 
    console.log( userTemp );
    res.end( JSON.stringify(userTemp));
});
})

var server = app.listen(8081, function () {
  var host = server.address().addressnode
  var port = server.address().port
  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})

接下来执行以下命令

$ node server.js 
应用实例,访问地址为 http://0.0.0.0:8081

在浏览器中访问 http://127.0.0.1:8081/listUsers

在浏览器中访问 http://127.0.0.1:8081/addUser

注意事项

  • 如果多个API写在一起,输入型路由应该放在最后