npm init // 输入指令后,创建package.json文件,并进行基本信息设置(可一直回车)
npm install 模块名 // 当前路径安装最新模块
npm install 模块名 -g // 全局安装,安装计算机C:/xx
npm install 模块名称--save // 生产环境(默认)
npm install 模块名称--save-dev // 开发环境
install简写:i
--save : S
--save-dev :D
// 国外下载可能过慢,可使用淘宝镜像源下载
npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm install 包名
安装:
npm i express
安装:
npm i morgan
安装:
npm i serve-favicon
安装:
npm i body-parser
安装:
npm i nodemon
启动服务器:
nodemon app.js // 在app.js所在文件夹的命令提示符内输入
安装:
npm i mysql
安装:
npm i ejs
安装:
npm i express-session
const myexpress = require("express");
const logger = require('morgan');
const bodyParser = require('body-parser');
const ejs = require("ejs");
// const xxxRouter = require("xxx") 引入并载入路由文件
const app = myexpress(); // 通过express的全局函数,创建一个服务
// 定义日志和输出级别
app.use(logger('dev'));
// 设置接受的请求信息,设置跨域
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
// res.header("Access-Control-Max-Age", "3600");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Headers", "X-Requested-With,X_Requested_With,Content-Type");
res.header("Access-Control-Allow-Methods", 'PUT, POST, GET, DELETE, OPTIONS');
//res.header("Access-Control-Allow-Credentials", "true");
next();
});
// 定义浏览器网页标签图片
const favicon = require("serve-favicon")
// 设置post请求
app.use(bodyParser.json({ limit: "2048kb" })); // 限制数据最大2MB
app.use(bodyParser.urlencoded({ extended: false }));
// session 的配置
app.use(ExpressSession({
name: "test", // cookie的名字
secret: "use1", //
cookie: { maxAge: 8000000 }, //设置session和cookie失效时间,单位:毫秒
resave: true,
rolling: true //更新session和cookire失效时间
}))
// 视图模板引擎相关配置
app.set("views", __dirname + "/views"); // 设置视图模板存放路径
app.engine("html", ejs.__express); // 模板引擎
app.set("view engine", "html"); // 模板文件后缀
// 设置静态资源文件的路径
app.use(myexpress.static(__dirname + "/public"));
// app.use(myexpress.static(__dirname + "/public", { index: "/html/login.html" })) //默认打开静态文件
// 载入网页标签图片
app.use(favicon(__dirname + "/public/img/cxk.jpg"))
// 载入路由文件
// app.use(xxxRouter)
// 配置服务端口监听
app.listen(9999, function () {
console.log("服务启动,端口号9999");
})
例如:
package.json 依赖文件(命令npm init)
public 静态资源文件夹(存放html css js images等)
app.js 项目入口文件
router 路由
view 视图
model 模型层
controller 控制层
在 ./model/ 文件夹下创建数据库连接文件
例如:
// dbConfig.js
const mysql = require("mysql"); // 导入mysql模块
/**
* 接受参数:
* sql:sql语句
* arr:将数组中的值替换sql中的?,防止sql注入
* callback:回调函数,用于接受数据库查询结果
*/
function dbOper(sql, arr, callback) {
const myconnect = mysql.createConnection({ // 配置数据库连接信息
host: "localhost", // 地址
user: "root", // 连接名
password: "password", // 连接密码
port: 3306, // 端口号
database: "databaseName" // 数据库名称
});
myconnect.connect(); // 打开连接
myconnect.query(sql, arr, callback); // 执行sql查询,返回结果给回调函数
myconnect.end(); // 关闭连接
}
module.exports = { // 进行暴露
dbOper,
}
model层文件用于书写sql语句进行数据库操作,并返回结果给controller层
例如:
// ./model/menuModel.js
const {dbOper} = require("./dbconfig")
function login({ user, pwd }) {
let sql = "select * from user where 1=1 and user=? and pwd=? and isDelete=1"
return dbAction(sql, [user, pwd])
}
function query({ part }) {
let sql = "select * from menu where 1=1 and isDelete=1"
if (part) {
sql += ` and part=${part ?? 0}`
}
return dbAction(sql, [])
}
// 操作数据库
function dbAction(sql, arr) {
arr && (arr instanceof Array) ? arr : []
return new Promise((resolve, reject) => { // 返回一个promise对象给Controller层
dbOper(sql, arr, function (err, data) {
// 通过回调函数获取查询结果,并根据据结果更改promise对象的状态
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
module.exports = {
query,
login
}
controller层文件用于处理请求以及对请求进行响应
例如:
// ./controller/menuController.js
const menuMod = require("../model/menuModel")
function login(req, resp) {
menuMod.login(req.body).then(res => {
if (res.length > 0) {
resp.send({ code: 200, message: "请求成功", data: res[0] })
return;
}
resp.send({ code: 403, message: "用户名不存在或密码出错", data: null })
}).catch(() => {
resp.send({ code: 500, message: "服务器错误" })
})
}
function query(req, resp) {
menuMod.query(req.query).then(res => {
resp.send({ code: 200, message: "请求成功", data: res })
}).catch(() => {
resp.send({ code: 500, message: "服务器错误" })
})
}
module.exports = {
query,
login
}
router层文件用于创建请求接口,对请求进行拦截
例如:
// ./router/menuRouter.js
const myexpress = require("express");
const menuCtrl = require("../controller/menuController")
const menuRouter = myexpress.Router();
// 设置请求方式、接口路径、业务处理的函数
// 菜单相关
menuRouter.get("/system/menu/query", menuCtrl.query)
// 登录(user,pwd)
menuRouter.post("/system/user/login", menuCtrl.login)
module.exports = menuRouter
// app.js
const menuRouter = require("./router/menuRouter")
...
app.use(menuRouter)
// 最好在文件底部载入(端口监听之上),否则其他配置未加载完,接口会出错,参考第3步
...
一般启动
node app.js // 在app.js的目录下
自动重启(需下载nodemon模块包)
nodemon app.js // 同样在app.js的目录下
从0开始搭建一个简单的nodejs服务器就这么多了