天天看點

express服務端搭建實作登入注冊

express是nodeJS常用的一個腳手架,最近做練手項目使用有些遺忘過來分享一下

本文主要分為兩個部分,首先介紹如何搭建,其次用實際的登入新增賬號寫一個接口

 一、

1、指令行建立項目

express  -e  項目名(如:express  -e   serveDemo)

npm i (cnpm yarn均可,npm記得切換鏡像)

npm start (啟動項目預設start 其他加上run)

 2、項目中使用ts

1、全局安裝typescript(把ts編譯為js):

     npm i typescript -g

     tsc -v  看看版本号,就知道是否安裝成功。

2、提供node和express中相關api的類型依賴:本地安裝 @types/node和@types/express

     npm i @types/node @types/express --save-dev    

   如果連接配接資料庫的話,再安裝 "@types/mysql": "^2.15.21",                 

3、在項目根目錄下配置 tsconfig.json檔案,告知tsc指令應該做什麼:

{

    "compilerOptions": {

      "target": "es2016",

      "module": "commonjs",

      "lib": ["es2016","dom"],

      "outDir": "./dist",

    },

    "exclude": ["node_modules"]

  }

4、編譯ts,就會把ts檔案編譯成js,并放置在dist目錄下(需要手工把非ts全部複制到dist目錄下)。

      tsc

5、把ts檔案編譯後放到記憶體中:全局安裝ts-node:

     npm install ts-node -g

 也不用把非ts檔案進行處理了。ts-node全部處理好了。

6、運作項目:

     ts-node ./bin/www

7、如果想用nodemon監聽

   nodemon -e ts --exec ts-node ./bin/www

    -e:表示指定監聽的擴充名清單,-e ts 就表示要監聽擴充名為ts的檔案是否有變化

    --exec:代表指令行執行的指令,即:--exec ts-node ./bin/www 表示要用ts-node執行./bin/www的檔案

3、通路

npm start之後浏覽器輸入http://localhost:3000/

express服務端搭建實作登入注冊

 此處内容來自服務端渲染,ejs預設代碼

express服務端搭建實作登入注冊

 在這裡就可以修改服務端渲染的代碼,ejs先不做過多說明,内容較多哈哈

以上呢就是最基本的建立項目流程,下面主要實操來進行分享

二、實作登入注冊接口 (這裡為了友善就先使用js來寫了,目錄結構就是上圖的)

1、我們先連接配接一下資料庫

代碼很簡單,我分為了兩個子產品,一個是資料庫的連接配接,一個是封裝方法,寫在了自定義db檔案夾裡面,

首先下載下傳MySQL依賴

npm install mysql -S

var mysql = require('mysql');  // 引用

 1)資料庫連接配接

const mysql = require("mysql")

var connection = mysql.createConnection({
    port:3306, // 端口号
    user:'root', // 自己的賬号
    password:'root', // 密碼
    database:'look_up' // 資料庫名字
})
connection.connect()

module.exports = connection
           

 這樣就算連接配接成功了

2)封裝我們需要的登入賬号方法,對了,我們需要一個資料庫和表

express服務端搭建實作登入注冊

我用的navicat,都一樣的

然後繼續在node裡面寫方法

const dblook = require('./dblook')

function queryUser(obj){
    console.log(obj)
    let sqlStr = `select * from user where 1=1`; // sql語句
    for(let key in obj){
        sqlStr += ` and ${key}='${obj[key]}'` 
    }
    console.log(sqlStr)
    return new Promise(function(resolve,reject){
        dblook.query(sqlStr,function(error,results,fields){
            if(error){
                reject(error)
            }else{
                console.log("result",results)
                resolve(results)
            }
        })
    })
}
module.exports = {
    queryUser
}
           

 我是寫兩個檔案,看個人習慣。這樣一個查詢語句的方法也就實作了

2、我們的接口要在app.js裡面進行use使用一下,大多數都把子產品流程寫在routes裡面

如上圖所示https://img-blog.csdnimg.cn/c40fcc2ade5a4e1ca9b7a4f033728115.png,我把login.js 也就是我的登入接口寫在了routes裡面,然後app.js裡面加入代碼

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var loginRouter = require('./routes/login') //+++++++++

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 跨域 +++++++++++++
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By",' 3.2.1')
  res.header("Content-Type", "application/json;charset=utf-8");
  next();
});

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/login', loginRouter) //++++++++++++

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
           

我是加了一個防止跨域的代碼塊和後面++++的代碼,其他均為預設代碼

下面就是login.js的代碼

const e = require('express');
var express = require('express')
var loginReg = require('../db/loginReg')
var jwt = require('jsonwebtoken')
var router = express.Router()


router.post('/', async function (req, res) {
    // console.log(req,111)
    let username = req.body.username;
    // let userpass = req.body.userpass;
    // console.log(username,userpass)

    try {
        let result = await loginReg.queryUser(req.body)
        console.log('result', result)
        // console.log(result.length)
        if (result.length == 1) {
            let token = jwt.sign(username, "what is your name")
            console.log(token)
            res.json({
                status: "success",
                token
            })
        } else {
            res.json({
                status: "fail"
            })
        }
    } catch (error) {
        res.json({
            status: "error"
        })
    }
})
module.exports = router;

// export default{};
           

這段代碼很簡單,我隻是加了一個token也就是我們登入嘗嘗需要做判斷的值,剩下的就是正常的try catch和異步操作,大家看起來比較輕松,(token的話我們需要暗轉依賴,npm i jsonwebtoken即可)

這樣呢從頭到尾就完事啦,

下面用airpost測試一下

express服務端搭建實作登入注冊
express服務端搭建實作登入注冊

 OK沒有問題

三、總結一下,個人很少寫後端,對于這種簡單的接口其實熟悉流程寫個sql語句就好了,高深的代碼再繼續研究,很喜歡這個腳手架,寫起來很友善。

繼續閱讀