博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nodejs教程09:实现一个带接口请求的简单服务器
阅读量:5790 次
发布时间:2019-06-18

本文共 3876 字,大约阅读时间需要 12 分钟。

示例代码请访问我的GitHub:

带接口请求的简单服务器需求

虽然当前还未涉及到数据库的知识,但已经可以通过文件读写,实现一个简单的服务器,需求如下:

  1. 用户通过GET方法请求/reg接口,实现注册流程。
  2. 用户通过POST方法请求/login接口,实现登录流程。
  3. 非接口请求则直接返回相应文件。

实现思路

  1. 新建users.json文件,用于存放用户列表数据。
  2. 新建index.html文件,实现表单及注册、登录的前端请求功能。
  3. 服务端判断请求路径,决定是前端是通过接口校验用户数据,还是请求HTML文件。
  4. 若是接口请求,则通过用户列表判断用户状态,实现注册和登录流程。

代码及示例

进入/lesson09文件夹,运行node server.js命令,在浏览器访问即可查看效果。

index.html代码如下:

示例代码:/lesson09/index.html

  
Document 用户:
密码:
复制代码

server.js代码如下:

示例代码:/lesson09/server.js

const http = require('http')const url = require('url')const fs = require('fs')const querystring = require('querystring')const server = http.createServer((req, res) => {  // 定义公共变量,存储请求方法、路径、数据  const method = req.method  let path = ''  let get = {}  let post = {}  // 判断请求方法为GET还是POST,区分处理数据  if (method === 'GET') {    // 使用url.parse解析get数据    const { pathname, query } = url.parse(req.url, true)    path = pathname    get = query    complete()  } else if (method === 'POST') {    path = req.url    let arr = []    req.on('data', (buffer) => {      // 获取POST请求的Buffer数据      arr.push(buffer)    })    req.on('end', () => {      // 将Buffer数据合并      let buffer = Buffer.concat(arr)      // 处理接收到的POST数据      post = JSON.parse(buffer.toString())      complete()    })  }  // 在回调函数中统一处理解析后的数据  function complete() {    try {      if (path === '/reg') {        // 获取get请求数据        const {          username,          password        } = get        // 读取user.json文件        fs.readFile('./users.json', (error, data) => {          if (error) {            res.writeHead(404)          } else {            // 读取用户数据            const users = JSON.parse(data.toString())            const usernameIndex = users.findIndex((item) => {              return username === item.username            })            // 判断用户名是否存在            if (usernameIndex >= 0) {              res.write(JSON.stringify({                error: 1,                msg: '此用户名已存在'              }))              res.end()            } else {              // 用户名不存在则在用户列表中增加一个用户              users.push({                username,                password              })              // 将新的用户列表保存到user.json文件中              fs.writeFile('./users.json', JSON.stringify(users), (error) => {                if (error) {                  res.writeHead(404)                } else {                  res.write(JSON.stringify({                    error: 0,                    msg: '注册成功'                  }))                }                res.end()              })            }          }        })      } else if (path === '/login') {        const {          username,          password        } = post        // 读取users.json        fs.readFile('./users.json', (error, data) => {          if (error) {            res.writeHead(404)          } else {            // 获取user列表数据            const users = JSON.parse(data.toString())            const usernameIndex = users.findIndex((item) => {              return username === item.username            })            if (usernameIndex >= 0) {              // 用户名存在,则校验密码是否正确              if (users[usernameIndex].password === password) {                res.write(JSON.stringify({                  error: 0,                  msg: '登录成功'                }))              } else {                res.write(JSON.stringify({                  error: 1,                  msg: '密码错误'                }))              }            } else {              res.write(JSON.stringify({                error: 1,                msg: '该用户不存在'              }))            }          }          res.end()        })      } else {        // 若不是注册或登录接口,则直接返回相应文件        fs.readFile(`.${path}`, (error, data) => {          if (error) {            res.writeHead(404)          } else {            res.write(data)          }          res.end()        })      }    } catch (error) {      console.error(error);    }  }})server.listen(8080)复制代码

转载地址:http://vemyx.baihongyu.com/

你可能感兴趣的文章
使用QTP录制自带Flight小实例
查看>>
JProfiler学习笔记
查看>>
Loadrunner脚本编程(4)-数据类型操作和字符串操作
查看>>
arpg网页游戏之地图(二)
查看>>
nginx 初体验
查看>>
Windows Server 2012 RC安装初体验
查看>>
cocos2d-x开发中wstring和string的转换
查看>>
如何解决Linux下的软件包依赖问题
查看>>
统一沟通-技巧-2-Lync 2010-照片-无显示-组织-显示-为-自己
查看>>
应用虚拟化,时不我待的变革——“瑞友杯”虚拟化征文
查看>>
IDS与IPS的区别
查看>>
Lync日常维护之二:批量修改用户所属SIP域
查看>>
在工作中学习,在学习中工作
查看>>
6436B Lab13 设计和实现域的重构
查看>>
我的友情链接
查看>>
性能压测诡异的Requests/second 响应刺尖问题
查看>>
Java 并发编程内部分享PPT分享
查看>>
酷客多荣获“2018年度中国最具创新力小程序品牌”奖
查看>>
Word 2003从入门到精通第4讲(表格)
查看>>
puppet成长日记二 Package资源详细介绍及案例分析
查看>>