当前位置:   article > 正文

Node.js篇01-安装与配置,基本使用,服务器,项目搭建,调试_node服务器的搭建和使用

node服务器的搭建和使用

1.安装与配置

官网下载, 并配置环境变量

查看安装成功/版本号: DOS命令 node -v

运行JS文件: node 文件名.js

2.基本使用

(1)CommonJS模块化

Node.js遵循了CommonJS模块化规范( e.g: 自定义模块 )

使用module.exports 导出

  1. // commonjs模块化开发
  2. function sum(){ //代码 }
  3. function mul(){ //代码 }
  4. // 向外导出一个
  5. // module.exports = sum
  6. // 导出多个
  7. module.exports = {sum, mul}

使用require()导入

  1. // 引用单个 文件后缀名可不写
  2. // const sum = require('./day01-01-基本使用①')
  3. // 引用同一个文件中的多个方法
  4. const { sum, mul } = require('./01-基本使用①')
  5. // 可直接调用
  6. sum()
  7. mul()

(2)环境初始化

npm 是 Node.js 的包管理工具,用来安装各种 Node.js 的扩展

环境初始化: npm init -y 生成package.json配置文件

(3)第三方模块的使用

1>安装

moment模块为例: npm i moment -g

安装模块会自动生成node_modules重要文件夹

  • -g 全局安装

  • --save/-S记录在节点下 , 在package.json中"dependencies"节点下生成依赖

  • -dev 开发模式 (--save-dev简写-D)

2>使用

直接使用require()导入模块, 使用即可

  1. // 引入 moment 模块
  2. const moment = require('moment')
  3. console.log(moment.now());
  4. console.log(moment().format());

(4)配置

1>配置运行命令

  • 创建bin/www.js文件

  • 修改package.json的"main"节点程序入口文件

  • 在package.json的"scripts"节点下添加节点"dev":"node bin/www.js"

  • 配置完成后, 程序运行命令为 npm run dev

2>配置启动服务器相关

  • nodemon

监听代码变化, 当文件修改时,自动重启服务器, 避免修改代码后频繁的手动关闭和开启服务器 npm i nodemon --save

  • cross-env

运行跨平台设置和使用环境变量的脚本, 这个迷你的包(cross-env)能够提供一个设置环境变量的scripts,能够以unix方式设置环境变量,然后在windows上也能兼容运行 npm i cross-env --save

  • 配置工具

在package.json的"scripts"节点下

  1. "dev": "cross-env NODE_ENV=develop nodemon node bin/www.js", //开发模式下
  2. "prd": "cross-env NODE_ENV=production nodemon node bin/www.js" //生产模式下

3.服务器

(1)创建服务器

在bin/www.js文件中创建服务器

  • 安装并引入http模块

  • 创建服务

  • 启动服务器

  1. // 创建服务器
  2. // 1. 引用 http
  3. const http = require('http')
  4. const { parse} = require('url')
  5. // 2, 创建服务
  6. const server = http.createServer((req, res) => {
  7. // req: request请求 res: response响应
  8. })
  9. // 3. 启动服务器
  10. server.listen(8081, () => {
  11. console.log('--------小m的服务器启动成功---------------- ')
  12. })

(2)获取get请求的参数

  1. // // 1. 引用 http
  2. const http = require('http')
  3. const queryString = require('querystring')
  4. const { URLSearchParams, parse} = require('url')
  5. // 2, 创建服务
  6. const server = http.createServer((req,res)=>{
  7. // req: request请求 res: response响应
  8. // 从req中获取请求相关内容
  9. const { method, url} = req //获取请求方式
  10. // console.log(method) // GET
  11. // console.log(url) // /api/getBlogs?id=1&uname=mm 浏览器地址栏中
  12. // 解析 url
  13. if(method === 'GET'){
  14. // 获取get请求的所有参数 (参数是 ? 后边的部分) split()会将分割后的字符串放在一个数组中, 参数取 ? 后边的
  15. const paramsStr = url.split('?')[1] // id=1&uname=mm
  16. const query = {}
  17. //=========================================
  18. // 方式1: 手动解析url
  19. /* // 分割各项参数
  20. const paramsArr = paramsStr.split('&') //[id=1, uname=mm]
  21. // 转换为对象格式
  22. paramsArr.forEach(item => {
  23. const param = item.split('=') //将每一项以 = 分割 [id,1] [uname,mm]
  24. query[param[0]] = param[1] //对象中每一项的键为param[0] 值为param[1]
  25. }); */
  26. //=========================================
  27. // 方式2 安装导入并使用queryString模块
  28. /* // docode() 将字符串转化为对象 parse()也可
  29. query = queryString.decode(paramsStr)
  30. // encode 将对象转换为字符串 不写'&','=',也默认转换为id=1&uname=mm格式
  31. // res.end() 服务器给客户端进行响应
  32. res.end(queryString.encode(query,'&','='))//id=1&uname=mm
  33. */
  34. //=========================================
  35. // 方式3 通过url获取 使用URLSearchParams模块 (推荐)
  36. // 创建对象
  37. /* const urlSearchParams = new URLSearchParams(paramsStr)
  38. console.log(urlSearchParams); //{ 'id' => '1', 'uname' => 'mm' } 带迭代器的对象
  39. console.log(urlSearchParams.get('id')); //1 获取id
  40. console.log(urlSearchParams.has('id')); // true 查看该对象中是否有id属性
  41. // 解析搜索字符串
  42. const keys = urlSearchParams.keys() //获取所有的key
  43. for (const key of keys) {
  44. console.log(key); // id uname
  45. query[key] = urlSearchParams.get(key) // 对象中的属性为获取到所有keys中的每一项key, 值为key对应的值
  46. } */
  47. //=========================================
  48. // 方式4 通过url模块获取引入 并使用 parse()
  49. // 参数1:要解析的url地址 参数2: 解析出来的是查询字符串还是查询对象,true是对象 false是字符串, 默认是false 参数3: 是否要解析出来host, 默认false
  50. const result = parse(url, false)
  51. console.log(query); //{ id: '1', uname: 'mm' }
  52. req.query = query //将该对象挂在req.query上边
  53. }
  54. })

(3)获取post请求的参数

  1. const http = require('http')
  2. const { parse} = require('url')
  3. // 2, 创建服务
  4. const server = http.createServer((req,res)=>{
  5. // 设置数据响应格式, 通常以JSON格式
  6. res.setHeader('content-type','application/json;charset=utf-8')
  7. // req: request请求 res: response响应
  8. // 从req中获取请求相关内容
  9. const { method, url} = req //获取请求方式
  10. console.log(url) // /api/ 浏览器地址栏中
  11. if(method === 'POST'){
  12. // 获取请求头信息
  13. const contentType = req.headers['content-type']
  14. console.log(contentType); // applicaton/json JSON格式发送数据
  15. // 获取post请求的参数, 需要使用数据监听
  16. const postParams = ''
  17. req.on('data', chunk=>{ //data数据流, chunk存储每次来的数据
  18. postParams += chunk.toString() //将每次来的数据拼接到字符串中
  19. })
  20. // 监听是否结束
  21. req.on('end', ()=>{
  22. req.body = JSON.parse(postParams) //字符串转换为对象,
  23. res.end(JSON.stringify({ // 服务器给客户端进行响应
  24. code: 0,
  25. message: '成功!',
  26. data: []
  27. }))
  28. })
  29. }
  30. })

(4)应用

  1. // 创建服务器
  2. // 1. 引用 http
  3. const http = require('http')
  4. const { parse} = require('url')
  5. // 2, 创建服务
  6. const server = http.createServer((req, res) => {
  7. // req: request请求 res: response响应
  8. // 解决跨域
  9. res.setHeader('Access-Control-Allow-Origin','*')
  10. // 设置数据响应格式, 通常以JSON格式
  11. res.setHeader('content-type', 'application/json;charset=utf-8')
  12. // 从req中获取请求相关内容
  13. const { method, url } = req //获取请求方式
  14. const obj = parse(url, true) // get请求 解析url
  15. req.query = obj.query
  16. const pathName = obj.pathname //获取请求的地址
  17. console.log(pathName);
  18. // 对请求进行处理
  19. if (method === 'GET' && pathName === '/api/getBlogs') {
  20. // 获取所有博客信息
  21. const blogs = [{
  22. id: 1,
  23. title: 'aaa',
  24. content: '哈哈哈哈哈哈哈'
  25. },{
  26. id: 2,
  27. title: 'bbb',
  28. content: '哈哈哈哈哈哈哈'
  29. }]
  30. // 获取参数 过滤
  31. const id = req.query.id
  32. let arr = blogs
  33. if(id){
  34. arr = blogs.filter(blog => blog.id === 1)
  35. }
  36. res.end(JSON.stringify({
  37. status: 200,
  38. ok: true,
  39. data: arr
  40. }))
  41. } else if (method === 'POST' && pathName === '/api/login') {
  42. // post请求 解析url
  43. let postParams = ''
  44. res.on('data', (chunk) => {
  45. postParams += chunk.toSring()
  46. })
  47. res.on('end', () => {
  48. // 将post请求的数据放置在req.body上
  49. req.body = JSON.parse(postParams)
  50. // 获取登录信息
  51. const { sid, password } = req.body
  52. if(sid === 'admin' && password === '123456'){
  53. res.end(JSON.stringify({
  54. code:1,
  55. message: '登录成功!',
  56. token: 'dewefsesdfds'
  57. }))
  58. }else{
  59. res.end(JSON.stringify({
  60. code:1,
  61. message: '用户或密码错误!',
  62. token: ''
  63. }))
  64. }
  65. })
  66. }
  67. })
  68. // 3. 启动服务器
  69. server.listen(8081, () => {
  70. console.log('--------小m的服务器启动成功---------- ')
  71. })

(5)代码优化

创建src/handler/serverHandler.js文件, 将www.js中请求处理过程分离, 并在www.js文件中引入

  1. //www.js
  2. // 创建服务器
  3. // 1. 引用 http
  4. const http = require('http')
  5. const serverHandler = require('../src/handler/serverHandler')
  6. // 2, 创建服务
  7. const server = http.createServer(serverHandler)
  8. // 3. 启动服务器
  9. server.listen(8081, () => {
  10. console.log('--------小m的服务器启动成功---------------- ')
  11. console.log(' ╭────╮ ┇ ')
  12. console.log(' ╓════╮ │┃ ┇ ╓═══║ ╓════╖ ')
  13. console.log(' ✔ ║ ┇ │┃ ┇ ║ ║ ┇┅┅┅═╛ ♡ ♡ ♡ ')
  14. console.log(' ║ ┇ ╰════╯ ╙═══╛ ╘═════ ')
  15. console.log('┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄')
  16. })
  1. //serverHandler.js文件
  2. const { parse } = require('url')
  3. const getBlogsRouter = require('../router/getBlogsRouter')
  4. const userRouter = require('../router/userRouter')
  5. // 获取post请求中的数据
  6. const getPostData = (req) => {
  7. const promise = new Promise((resolve, reject) => { //resolve成功 reject失败
  8. let postParams = ''
  9. req.on('data', chunk=> {
  10. postParams += chunk
  11. })
  12. req.on('end', () => {
  13. if (postParams !== '') {
  14. resolve(JSON.parse(postParams)) //有数据
  15. } else {
  16. resolve({}) // 没有参数时,返回{}
  17. }
  18. })
  19. })
  20. return promise
  21. }
  22. const serverHandler = (req, res) => {
  23. // req: request请求 res: response响应
  24. // 设置数据响应格式, 通常以JSON格式
  25. res.setHeader('content-type', 'application/json;charset=utf-8')
  26. // 从req中获取请求相关内容
  27. const { url } = req //获取请求方式
  28. const obj = parse(url, true) // get请求 解析url
  29. req.query = obj.query
  30. getPostData(req).then((data) => {
  31. req.body = data
  32. getBlogsRouter(req)?.then(data => {
  33. res.end(JSON.stringify(data))
  34. })
  35. // ? 作用 如果undefined,前边没有拿到数据, 则不执行then()
  36. // 对post请求进行处理
  37. userRouter(req)?.then(data => {
  38. res.end(JSON.stringify(data))
  39. })
  40. })
  41. }
  42. module.exports = serverHandler

创建src/router, 将处理业务逻辑与获取数据进行分离,存放各类请求处理

创建src/control目录, 存放数据处理相关,

  1. //blogs.js
  2. // 获取所有博客信息
  3. const blogs = [{
  4. id: 1,
  5. title: 'aaa',
  6. content: '哈哈哈哈哈哈哈',
  7. },{
  8. id: 2,
  9. title: 'bbb',
  10. content: '哈哈哈哈哈哈哈',
  11. }]
  12. const getBlogList = (params) => {
  13. // 获取参数 过滤
  14. const id = params.id
  15. if (id) {
  16. const arr = blogs.filter((blog) => blog.id === 1)
  17. return arr
  18. }
  19. return blogs
  20. }
  21. module.exports = getBlogList
  1. //user.js
  2. const users = [{
  3. username: 'admin',
  4. password: '123456',
  5. realname: 'mm',
  6. }{
  7. username: 'admin1',
  8. password: '123456',
  9. realname: 'mm1',
  10. }]
  11. const login = (params) => {
  12. const { username, password } = params
  13. if (!username || username === '' || !password || password === '') {
  14. return {
  15. code: -1,
  16. message: '用户名或密码为空',
  17. }
  18. } else {
  19. const result = users.filter(
  20. (user) => user.username === username && user.password === password
  21. )
  22. if (result.length == 0) {
  23. return {
  24. code: 0,
  25. message: '用户名或密码错误',
  26. }
  27. } else {
  28. return {
  29. code: 0,
  30. data: result,
  31. message: '',
  32. }
  33. }
  34. }
  35. }
  36. const updateUser = params => {
  37. const { id, realname } = params;
  38. if (!id || id === "" || !realname || realname === "") {
  39. return {
  40. code: -1,
  41. message: 'id或realname不能为空'
  42. }
  43. } else {
  44. const index = users.findIndex(user => user.id === (id - 0));
  45. if (index === -1) {
  46. return {
  47. code: 0,
  48. message: '找不到该用户'
  49. }
  50. } else {
  51. users[index].realname = realname;
  52. return {
  53. code: 0,
  54. status: true,
  55. message: '修改成功'
  56. }
  57. }
  58. }
  59. }
  60. module.exports = {
  61. login,
  62. updateUser
  63. }

在router中进行调用

  1. // getBlogsRouter.js
  2. const { parse} = require('url')
  3. const { getBlogList } = require('../control/blogs')
  4. const getBlogsRouter = (req)=>{
  5. const { method, url} = req
  6. const obj = parse(url, true) // get请求 解析url
  7. const pathName = obj.pathname //获取请求的地址
  8. if (method === 'GET' && pathName === '/api/getBlogs') {
  9. // control/blogs.js中获取数据
  10. const result = getBlogList(req.query)
  11. // 返回Promise对象
  12. return Promise.resolve(result)
  13. }
  14. }
  15. module.exports = getBlogsRouter
  1. //userRouter.js
  2. const { parse } = require('url')
  3. const { login, updateUser} = require('../control/user')
  4. const userRouter = (req) => {
  5. const { method, url } = req
  6. const obj = parse(url, true) // get请求 解析url
  7. const pathName = obj.pathname //获取请求的地址
  8. if (method === 'POST' && pathName === '/api/login') {
  9. const result = login(req.body);
  10. return Promise.resolve(result);
  11. }else if(method === 'POST' && pathName === '/api/updateUser'){
  12. return Promise.resolve(updateUser(req.body))
  13. }
  14. }
  15. module.exports = userRouter

(6)数据库

安装 npm i mongodb --save-dev

新建src/config/dbconfig.js, 存放数据库配置相关信息

  1. // 数据库配置
  2. const MONGODB_URL = 'mongodb://127.0.0.1:27017'
  3. const DB_NAME = 'mydb01_blogs'
  4. module.exports = {
  5. MONGODB_URL,
  6. DB_NAME
  7. }

新建src/dbUtils/mongodbUtil.js,存放数据库工具

  1. // 创建客户端
  2. const mongodbClient = require('mongodb').MongoClient
  3. const { MONGODB_URL, DB_NAME } = require('../config/dbconfig')
  4. const getCollection = ()=>{
  5. return mongodbClient.connect(MONGODB_URL,{}).then(conn=>{
  6. // 使用数据库
  7. const db = conn.db(DB_NAME)
  8. // 使用集合
  9. const collection = db.collection('blogs')
  10. //返回连接
  11. return Promise.resolve(collection)
  12. }).catch(err=>[
  13. Promise.reject({
  14. message: err
  15. })
  16. ])
  17. }
  18. // 查询
  19. const searchBlogs = (params={}) => {
  20. return getCollection().then(collection => {
  21. // console.log('获取成功!');
  22. // 进行查询
  23. return collection.find(params).toArray().then(data=>{
  24. return Promise.resolve(data)
  25. })
  26. })
  27. }
  28. // 增加
  29. const addBlogs = (params={}) =>{
  30. if(Object.keys(params).length === 0){
  31. return Promise.resolve({
  32. ok: false,
  33. count: 0,
  34. message: "添加失败, 没有参数!!"
  35. })
  36. }else{
  37. return getCollection().then(collection=>{
  38. return collection.insertOne(params).then(res=>{
  39. if (res.acknowledged) {
  40. return Promise.resolve({
  41. ok: true,
  42. count: 1,
  43. message: "添加成功!"
  44. })
  45. } else {
  46. return Promise.resolve({
  47. ok: false,
  48. count: 0,
  49. message: "添加失败!"
  50. })
  51. }
  52. })
  53. })
  54. }
  55. }
  56. module.exports = {
  57. searchBlogs,
  58. addBlogs
  59. }

修改blogs.js内容

  1. const { searchBlogs,addBlogs} = require('../dbUtils/mongodbUtil.js')
  2. const getBlogList = (params) => {
  3. return searchBlogs(params) //因为searchBlogs方法返回的是promise对象, 故得return
  4. }
  5. const insertBlogs = (params)=>{
  6. return addBlogs(params)
  7. }
  8. module.exports = {
  9. getBlogList,
  10. insertBlogs
  11. }

最后在router的相关文件中, 配置相关路由(e.g: 增删改查...)

4.调试

  • 安装: npm i node-inspect -g

  • 在package.json中的"dev"节点中配置 --inspect=9330

"dev": "cross-env NODE_ENV=develop nodemon --inspect=9330 ./bin/www.js"
  • 在调试的地方写debugger进行调试

  • Chrome浏览器地址栏中输入chrome://inspect, 即可在前台调试

项目目录:

为了让我的服务器启动的时候, 可以好看一点, 哈哈哈哈二话不说, 给大家看效果叭

PreviousNotes:

https://blog.csdn.net/qq_54379580/article/details/126781836?spm=1001.2014.3001.5502

代码压缩包放在这里啦

https://download.csdn.net/download/qq_54379580/87381329

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/247814
推荐阅读
相关标签
  

闽ICP备14008679号