阿里云服务器+node+express+mysql,从0搭建node服务(1.5万字附源码地址)

阿里云服务器+node+express+mysql,从0搭建node服务(1.5万字附源码地址)

相信很多前端和我一样,希望能拥有一台自己从0搭建的服务器,放一些自己写的轮子,起一个属于自己的node服务,把我的踩坑历史分享给大家,趁着周末,愉快的搞起来吧。

github地址: github.com/wuxiaohuaer/

一、服务器和数据库

买服务器的作用有很多,比如自己写的一些开源的前端项目、自己的博客网站、以前写过的小项目、自己写的node服务等等,都可以放在服务器,方便交流,也方便自己查看。我买服务器最主要的目的是,想自己纯实战的用node开发一套后台接口。

现在市面上非常多的服务器,阿里云、华为云等等,我买的是阿里云的服务器,便宜、操作简单。

下面这个是阿里云的官网:

aliyun.com/?

直接选择云服务器ECS就可以了

如果你是新用户,最近应该有一个0.9折的活动,服务器、数据库、oss一共加起来92块钱,非常划算,直接下单就可。

二、配置服务器和数据库

配置服务器

1、进入控制台,创建实例

2、重置实例密码,这个地方重置的实例的密码,等连ssh的时候要用,得记下来

配置数据库

按照下面的图,一步一步操作非常轻松加愉快

三、远程连接服务器

进入到紧张刺激的远程连接服务器的环节,此处坑多且深:

要连接服务器必须要有一个连接工具,可以用xshell,也可以用FinalShell之类的,只是一个工具,都可以的,这里以xshell为例:

(一)新建一个ssh

新建一个ssh,主机就写给你发短信的那个IP,端口是22,密码就是刚才实例的密码

(二)安装node

网上安装node的教程非常多,我推荐一个比较快也比较稳定的

1、下载node

我在根目录新建了一个node文件夹,在它下面安装的node,命令:

mkdir node

直接运行:

wget -c https://nodejs.org/dist/v8.9.1/node-v8.9.1-linux-x64.tar.xz

2、解压node包

直接运行:

tar -xvf node-v8.9.1-linux-x64.tar.xz

想换名字就换,不想换就算了,命令:

mv node-v8.9.1-linux-x6 nodeJs

这个时候,你可以使用一下node命令,发现会报错

因为node命令和npm命令并不是全局命令,需要建立一个软连,命令:

ln -s /node/nodeJs/bin/npm /usr/local/bin/ 
ln -s /node/nodeJs/bin/node /usr/local/bin/

3、设置全局变量

尝试把node配置到环境变量中 .bash_profile 中

vi ~/.bash_profile
把下面的加上去
PATH=$NODE_HOME/bin:$PATH
export NODE_HOME
export PATH

这个时候node和npm就已经安装好了,输入node和npm命令都不会报错了

(三)安装nginx

1、安装依赖

yum -y install pcre* yum -y install openssl*

2、下载安装包

wget http://nginx.org/download/nginx-1.15.8.tar.gz

3、解压安装包

tar -xvf nginx-1.15.8.tar.gz

4、编译

./configure \
make install

5、软连接

ln -s /usr/local/nginx nginx-1.15.8

6、启动

进入nginx/sbin
    nginx

安装完nginx就可以把写的前端页面部署到服务器了

四、配置nginx

1、随便找一个文件夹,放一个html文件

2、进入/user/local/nginx/conf,编辑nginx.conf文件

listen       7070; // 页面接口
server_name  localhost;
#charset koi8-r;
#access_log  logs/host.access.log  main;
配置页面的代理
location / {
    root   /home; // 页面所在的文件夹
    index  index.html index.htm;
这个地方配置接口反向代理
location /api {
    proxy_pass http://xx.xx.xx.xx/api;
}

这个时候去浏览器打开ip:7070,哈哈哈,页面加载不出来。

然后折腾一下午,前面的流程全部走了一遍,还是打不开,原来是阿里云的端口没开,千万别忘了开端口,血的教训。

前端进阶路上node是躲不过去的技术栈,对于大部分前端来说,都或多或少的写过一些node代码或者demo,接下来就一步一步构建属于自己的node后台接口。

技术栈:node.js、express框架、mysql、pm2

写在前面

这篇博客适合有一定前端开发经验、学习过一点node.js的同学,因为项目当中使用了非常多的es6语法,所以最好对es6也有一定的了解。

五、express

1、新建一个js文件(index.js)

2、全局安装:

npm install express --save

3、js文件引入express

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

4、新建一个get请求的接口

app.get('/api/get', function (req, res) {
    // 返回的是json类型的数据
    // 温馨提示:在浏览器中输入http://localhost:8000/api/get,可以模拟请求,拿到{"method":"GET","data":{"name":"wanghuahua","age":18}}说明正常
    res.json({
        method: 'GET',
        data: [{
            name: 'wanghuahua',
            age: 18
});

5、app.listen(8000)

浏览器输入http://localhost:8000/api/get,OK,一个node接口就开发完了。

完成这一步,恭喜你,你已经是一个全栈开发工程师了!

一切不从实战出发的的学习都是耍流氓,把刚开发完的接口连上数据库才能更逼真。

六、连接数据库

1、远程连接数据库

需要一个可视化工具,Navicat之类,这里就以Navicat为例
在阿里云配置数据库的时候,需要配置外网地址和账号密码
打开Navicat直接连接就好了
随便建一个库,库里面建一个表

2、安装mysql

npm install mysql --save

3、项目引入sql

var mysql = require('mysql');     //引入mysql模块

4、创建一个sql实例,加入配置

var connection = mysql.createConnection({      //创建mysql实例
    host: 'rm-xxxxxxxx.mysql.zhangbei.rds.aliyuncs.com',    // 连接的sql地址,外网地址
    user: 'jerry',  // 用户名
    password: 'xxxxxx', // 用户密码
    database: 'xx'  // 选择的库
connection.connect();

5、接口里面使用数据库的数据

app.get('/api/get', function (req, res) {
    // 返回的是json类型的数据
    connection.query('SELECT * FROM name', (err, results, fields) => {
        if(err){
            console.log(err);
        res.json({
            method: 'GET',
            data: results
});

在浏览器中输入http://localhost:8000/api/get,拿到刚才新建表中的数据

数据库连接成功!

七、封装sql

项目中要使用express,肯定要使用路由进行多模块开发,每一个模块都创建一个sql实例,就太麻烦了,把sql抽离出来,进行一些封装,让代码看起来更加优雅。

1、新建一个config目录

目录下是baseData.js和sql.js两个文件

2、basedata.js里面放数据库配置

module.exports = {
    host: 'rm-xxxxxx.mysql.zhangbei.rds.aliyuncs.com',  // 连接的服务器
    user: 'jerry',  // 用户名
    password: '@xxxxxx',    // 用户密码
    database: 'pt'  // 选择的库
}

3、sql.js里面用来暴露一个方法

var mysql = require('mysql');
var database = require('./config')
//向外暴露方法
module.exports = {
    query : function(sql,params,callback){
        //每次使用的时候需要创建链接,数据操作完成之后要关闭连接
        var connection = mysql.createConnection(database);        
        connection.connect(function(err){
            if(err){
                console.log('数据库链接失败');
                throw err;
         //开始数据操作
         //传入三个参数,第一个参数sql语句,第二个参数sql语句中需要的数据,第三个参数回调函数
        connection.query( sql, params, function(err,results,fields ){
           if(err){
                console.log('数据操作失败');
                throw err;
            //将查询出来的数据返回给回调函数
            callback && callback(results, fields);
            //results作为数据操作后的结果,fields作为数据库连接的一些字段
            //停止链接数据库,必须再查询语句后,要不然一调用这个方法,就直接停止链接,数据操作就会失败
             connection.end(function(err){
                  if(err){
                      console.log('关闭数据库连接失败!');
                      throw err;
};

3、修改index.js

刚才的index.js就可以直接引入封装好的sql了

var db = require("../config/sql")
app.get('/api/get', function (req, res) {
    db.query('SELECT * FROM name', (err, results, fields) => {
        if(err){
            console.log(err);
        res.json({
            method: 'GET',
            data: results
});

sql就封装完成了

八、使用express路由

要开发整套的接口,不可能一个js文件上开发,要模块化开发就得使用router,express的路由非常方便。

1、新建一个routes文件夹

里面放需要模块化的接口文件(user.js)

2、开发user.js

var express = require("express");
var api  = express.Router();
var db = require("../config/sql")
api.post('/getUserList', function (req, res) {
    db.query('SELECT * FROM sys_user', (err, results, fields) => {
        if(err){
            res.json({
                code: '1000',
                message: err
        res.json({
            code: '0000',
            data: results
module.exports = api;

3、修改index.js

var user = require("./routes/user")
app.use("/api", user);

这样user.js模块的接口就挂在api下面,可以暴露出来请求了

九、mysql基本操作

因为我们用的是mysql当做数据库来开发,,虽然后面为了写的更快,会使用sequelize这些工具,但是要做一个全栈,sql语句肯定要掌握。

此处的语句示例来自21分钟mysql入门教程:

1、查询

select 列名称 from 表名称 where 条件

查询年龄在21岁以上的所有人信息: select * from students where age > 21

2、新增

insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

insert into students values(NULL, "吴建运", "男", 20, "13811371377");

3、update

update 表名称 set 列名称=新值 where 更新条件;

将id为5的手机号改为默认的"-": update students set tel=default where id=5;

4、delete

delete from 表名称 where 删除条件;

删除id为2的行: delete from students where id=2;

5、添加列

alter table 表名 add 列名 列数据类型 [after 插入位置];

在表的最后追加列 address: alter table students add address char(60);

6、修改列

alter table 表名 change 列名称 列新名称 新数据类型;

将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";

7、删除列

alter table 表名 drop 列名称;

删除 birthday 列: alter table students drop birthday;

8、重命名表

alter table 表名 rename 新表名;

重命名 students 表为 workmates: alter table students rename workmates;

9、删除表

drop table 表名;

删除 workmates 表: drop table workmates;

10、删除整个数据库

drop database 数据库名

samp_db 数据库: drop database samp_db;

十、获取post请求参数的三种模式

(一)www-form-urlencoded

1、要做需要 body-parse 插件支持

npm install body-parse --save

2、在index.js中使用body-parse

var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({    
  extended: true
}));

3、在路由的接口内使用.body接收参数

// 查询接口
api.post('/getUserList', function (req, res) {
    var sql = `SELECT * FROM sys_user WHERE userid = ${req.body.userid}`
    db.query(sql, (err, results, fields) => {
        if(err){
            return res.json({
                code: '1000',
                message: err
        res.json({
            code: '0000',
            data: results