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/
此處内容來自服務端渲染,ejs預設代碼
在這裡就可以修改服務端渲染的代碼,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)封裝我們需要的登入賬号方法,對了,我們需要一個資料庫和表
我用的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測試一下
OK沒有問題
三、總結一下,個人很少寫後端,對于這種簡單的接口其實熟悉流程寫個sql語句就好了,高深的代碼再繼續研究,很喜歡這個腳手架,寫起來很友善。