Nodejs之http的表单提交

yizhihongxing

首先,在Node.js中,通过使用内置的http模块,我们可以轻松地创建一个Web服务器。本文将围绕如何实现HTTP表单提交展开,先介绍如何在Node.js中创建一个简单的Web服务器,然后展示如何接收并处理表单提交数据。

创建Web服务器

我们先来看一下如何使用Node.js的http模块创建一个简单的Web服务器,示例代码如下:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  res.write('<h1>Hello, World!</h1>');
  res.end();
});

server.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

上面的代码中,我们调用了Node.js内置的http模块,并使用该模块提供的createServer()方法创建了一个基本的Web服务器。createServer()方法接受一个回调函数,该函数接收两个参数:请求对象(req)和响应对象(res)。我们在回调函数中先调用res.writeHead()方法设置响应头信息,然后调用res.write()方法写入响应内容,最后调用res.end()方法结束响应。

在本地运行上述代码后,访问http://localhost:3000,我们可以看到浏览器输出“Hello, World!”。

接收表单数据

接下来我们来看如何接收HTTP表单提交数据。在HTTP协议中,表单提交数据默认以POST方式发送,Node.js可以通过解析请求体数据来获取表单提交数据。

const http = require('http');
const {parse} = require('querystring');

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', chunk => {
      body += chunk.toString();
    });
    req.on('end', () => {
      const data = parse(body);
      res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
      res.write(`<h1>Hello, ${data.name}!</h1>`);
      res.end();
    });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.write(`
      <form method="POST">
        <label>
          Your name:
          <input type="text" name="name" />
        </label>
        <br/>
        <br/>
        <button type="submit">Submit</button>
      </form>
    `);
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

上述代码中,我们通过判断请求的方法是否为POST来区分表单提交请求和普通GET请求。当请求为POST时,我们通过data事件和end事件分别接收请求体数据,并使用Node.js内置的querystring模块解析表单数据。

最后,我们在响应中动态生成HTML表单,使用label和input元素收集用户输入的数据,并将数据通过POST方式提交到Web服务器。当收到表单提交的请求时,我们将表单数据解析出来,并动态生成响应体数据。

示例说明

示例1:计算正方形面积

下面的示例演示如何使用表单收集用户输入数据,并计算正方形的面积。

const http = require('http');
const {parse} = require('querystring');

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', chunk => {
      body += chunk.toString();
    });
    req.on('end', () => {
      const data = parse(body);
      const side = parseInt(data.side, 10);
      const area = Math.pow(side, 2);
      res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
      res.write(`<h1>The area of the square is ${area}</h1>`);
      res.end();
    });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.write(`
      <form method="POST">
        <label>
          Side length:
          <input type="number" name="side" />
        </label>
        <br/>
        <br/>
        <button type="submit">Submit</button>
      </form>
    `);
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

在浏览器中访问http://localhost:3000,我们可以看到生成的表单,输入正方形的边长,点击'提交'按钮,服务器返回计算结果。

示例2:注册账号

下面的示例演示如何使用表单收集用户的注册信息,并将用户信息保存到数据库中。

const http = require('http');
const {parse} = require('querystring');
const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', chunk => {
      body += chunk.toString();
    });
    req.on('end', () => {
      const data = parse(body);
      const username = data.username;
      const password = data.password;
      connection.query(`INSERT INTO users (username, password) VALUES ('${username}', '${password}')`, (error, result) => {
        if (error) {
          console.log(error);
          res.writeHead(500, {'Content-Type': 'text/plain'});
          res.write('Oops, something went wrong!');
          res.end();
        } else {
          res.writeHead(201, {'Content-Type': 'text/html; charset=utf-8'});
          res.write(`<h1>You have successfully registered an account with username ${username}</h1>`);
          res.end();
        }
      });
    });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.write(`
      <form method="POST">
        <label>
          Username:
          <input type="text" name="username" />
        </label>
        <br/>
        <br/>
        <label>
          Password:
          <input type="password" name="password" />
        </label>
        <br/>
        <br/>
        <button type="submit">Sign up</button>
      </form>
    `);
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

在这个示例中,我们使用了mysql模块连接MySQL数据库,并在表单提交成功后将用户信息插入到数据库中。需要注意,上述示例代码中使用了明文的SQL语句,这是非常不安全的,我们应该使用参数化查询或ORM库来避免SQL注入攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs之http的表单提交 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Ajax中post方法直接返回以0开头数字出错问题分析

    当我们使用Ajax中的post方法发起请求时,有时可能会出现返回值以0开头数字出错的情况。这个问题的原因是在Ajax里面,返回以0开头的数字会被解析成八进制数,而不是十进制数,因此造成了解析错误。 解决这个问题的方法很简单,一种方法是将返回值转换成字符串类型,另一种方法是在服务器端设置返回头,让其返回值以JSON格式输出。 下面,我将分别演示这两种解决方法:…

    node js 2023年6月8日
    00
  • JavaScript工具库之Lodash详解

    JavaScript工具库之Lodash详解 简介 Lodash是一个流行的JavaScript工具库,提供了很多实用的函数,可以大大简化JavaScript编程的工作量。Lodash不仅提供了很多常用的JavaScript内置函数的增强版,还提供了很多新的实用函数,如各种数据处理、字符串操作、数组操作、函数式编程等等。 安装 可以通过npm安装Lodash…

    node js 2023年6月8日
    00
  • JS 使用for循环遍历子节点查找元素

    下面是使用for循环遍历子节点查找元素的完整攻略。 1. 获取父节点和子节点 首先,我们需要使用 document.getElementById()方法或其他方法获取到父节点,例如: const parent = document.getElementById(‘parentNode’); 然后,我们需要获取到父节点的所有子节点,可以使用 childNode…

    node js 2023年6月8日
    00
  • Vue3.0中的monorepo管理模式的实现

    Vue 3.0采用了monorepo管理模式,它允许开发者在一个代码仓库中管理多个相关项目,有效提高了资源的可复用性和管理效率。下面是实现Vue3.0中的monorepo管理模式的完整攻略。 创建monorepo仓库 首先,我们需要创建一个monorepo仓库用于存放多个相关项目。可以选择使用GitHub或者GitLab等平台的仓库,也可以使用本地Git仓库…

    node js 2023年6月9日
    00
  • Angular 13+开发模式慢的原因及构建性能优化解析

    Angular 13+是一款流行的前端开发框架,但在使用过程中,我们可能会遇到页面加载速度慢甚至影响用户体验的问题。本文将介绍Angular 13+调试和优化开发模式的方法,以及如何进行构建性能优化。 1. 开发模式慢的原因 在开发模式下,Angular 13+的开发过程可能会很慢,主要原因是Angular编译器需要在每次修改代码后重新编译显示效果。另外,一…

    node js 2023年6月9日
    00
  • JavaScript二叉树及各种遍历算法详情

    JavaScript二叉树及各种遍历算法详情 什么是二叉树 二叉树是一种树形数据结构,每个节点最多拥有两个子节点。根据节点的位置分为根节点、左子节点和右子节点。 二叉树的遍历方式 常用的二叉树遍历算法分为三种:前序遍历、中序遍历和后序遍历。 前序遍历 前序遍历是指先访问当前节点,然后按照左子树-右子树的顺序遍历所有子节点。 下面是一段前序遍历的示例代码: f…

    node js 2023年6月8日
    00
  • nodejs实现bigpipe异步加载页面方案

    我来为您讲解“Node.js实现BigPipe异步加载页面方案”的攻略,包括基本概念、实现步骤和示例说明。 什么是BigPipe? BigPipe是一种流行的Web页面渲染技术,它可以提高页面加载速度和用户体验。它的核心思想是将页面切分成若干个小块,每个小块可以单独渲染和缓存,最终组装成一个完整的页面。 Node.js实现BigPipe的步骤 1. 拆分页面…

    node js 2023年6月8日
    00
  • Lua 中 pairs 和 ipairs 的区别

    Lua 中 pairs 和 ipairs 都是用来遍历 table 中的键值对的函数。它们的主要区别在于遍历时的顺序和范围。 pairs 函数 pairs 函数遍历 table 中所有的 key-value 对,遍历的顺序是无序的。pairs 返回两个值:键和与键对应的值。示例代码如下: local t = {name = "Tom", …

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部