自定义一个buffer数据分隔 模块,将其保存在node_modules文件中。

// 分割buffer数据:参数:buffer数据,分隔符
module.exports = function(buffer, delimiter) {
  let arr = [];
  let n = 0;
  // 当分隔符存在时
  while((n = buffer.indexOf(delimiter)) != -1) {
    // 将第一个分隔符前边的数据添加到数组中
    arr.push(buffer.slice(0, n));
    // 将第一个分隔符后的部分重新赋值给buffer
    buffer = buffer.slice(n + delimiter.length);
  // 将最后的buffer数据添加到数组中
  arr.push(buffer);
  return arr;
const http = require("http");
// 引入暴露的buffer模块,node_modules文件中的模块不需要写相对路径
const bufferSplit = require("buffer_util");
const fs = require("fs");
let server = http.createServer((req, res) => {
  // 如果表单上传到的路径是..
  if(req.url == "/upload") {
    // req.headers 包含与当前请求相关的Headers对象
    console.log(req.headers['content-type']); // 'multipart/form-data; boundary=----WebKitFormBoundary1VOd0XNAiE8Tv2Vh'
    // 获取分隔符
    let boundary ="--" + req.headers['content-type'].split("; ")[1].split("=")[1];
    console.log(boundary);
    let arr = [];
    // buffer是自定义的一个参数,表示一个二进制的数据
    req.on("data", (buffer) => {
      arr.push(buffer);
    // 因为服务器收到的数据是二进制的,所以需要对数据进行一些处理
    req.on("end", () => {
      let buffer = Buffer.concat(arr); // 将二进制数据拼接到一起
      // 1.以分隔符切割
      let res = bufferSplit(buffer, boundary);
      console.log(res);
      // 2.去掉数组第一个和最后一个null
      res.pop(); // 删除第一个元素
      res.shift(); // 删除最后一个元素
      // 3.处理每一个元素
      res.forEach((item) => {
        let buffer = item.slice(2, item.length-2);
        let index = buffer.indexOf("\r\n\r\n");
        let info = buffer.slice(0, index).toString();
        let data = buffer.slice(index+4);
        console.log(info, data);
          打印结果:
          Content-Disposition: form-data; name="username" <Buffer 6c 79 64 69 61>
          Content-Disposition: form-data; name="psw" <Buffer 61>
          Content-Disposition: form-data; name="file1"; filename="note.txt"
          Content-Type: text/plain <Buffer 61 6a 61 78 20 e5 bc 82 e6 ad a5 6a 61 76 61 73 63 72 69 70 74 e5 92 8c 78 6d 6c 0d 0a 31 20 61 6a 61 78 e4 b8 8d e6 98 af e4 b8 80 e9 97 a8 e6 96 b0 ... 829 more bytes>
        // 普通的数据只有一行,文件有两行
        if (info.indexOf("\r\n") != -1) {
          // 如果有回车换行,即文件
          let arr2 = info.split("\r\n")[0].split("; ");
          let name = arr2[1].split("=")[1]; // let定义的变量只在{}中有效,所以可以用name
          name = name.substring(1, name.length-1);
          let filename = arr2[2].split("=")[1];
          filename = filename.substring(1, filename.length-1);
          console.log(filename); // note.txt
          fs.writeFile(`upload/${filename}`, data, err => {
            if(err) {
              console.log(err);
            } else {
              console.log("upload success"); // upload success
        } else {
          // 没有回车换行,即普通数据
          let name = info.split("; ")[1].split("=")[1]; // 获取name的值
          name = name.substring(1, name.length-1); // 从第一个开始截取
          data = data.toString();
          console.log(name + ":" + data);
            打印结果:
            username:lydia
            psw:aaa
server.listen(8080);

用node自己实现表单上传的数据处理比较繁琐,可以使用第三方库,如formidable, multiparty
下一篇将讲述如何通过第三方库来 处理上传的数据与文件。

自定义一个buffer数据分隔 模块,将其保存在node_modules文件中。// 分割buffer数据:参数:buffer数据,分隔符module.exports = function(buffer, delimiter) { let arr = []; let n = 0; // 当分隔符存在时 while((n = buffer.indexOf(delimiter)) ... const http = require("http"); const path = require("path"); const querystring = require("querystring"); const { getPostData, downloadFile }... <templete> <inputtype="file"id="file"style="width:50%;height:50px;"placeholder="请选择上文件"@change="uploadFile"/> <buttonstyle="width:40%;height:50px;"@click="loa...
在前端项目开发中,我们经常会遇到node_modules里的包有问题,当自己手动更改成正确的后,自己没问题了,但是别人重新npm install时还会有同样的问题,那么如何将node_modules的更改保存到项目中呢,这样别人在生成依赖后能有一个正常的环境 patch-package https://www.npmjs.com/package/patch-package 这个包可以在npm install后按照项目里保存的更改自动修改node_modules,非常好用 使用步骤:
首先,我们能想到的思路是直接修改第三方库的代码,不过这会带来团队协作的问题,你的改动需要同步到团队所有成员,比较麻烦。好在,我们可以使用 patch-package 这个库来解决这类问题。一方面,它能记录第三方库代码的改动,另一方面也能将改动同步到团队每个成员。我们以vue常用的 iview 组件库做实验,先安装一下: 我们随便修改一行,打开某个文件 在slot后面加了个test,然后我们希望这行修改的代码,在npm install重新安装组件库的时候仍存在。如何实现呢? 2、修改脚本 package.js
var buffer_utils = require('node-buffer-utils'); var val = 256, len = 2, res = buffer-utils.createIntBE(val, len); console.log(res); // <Buffer> 读取十六进制字符串(缓冲区) 从缓冲区返回十六进制字符串。 var buffer = new Buffer([0xab, 0xcd, 0xef]); buffer_utils.readHexString(buffer); // -> 'abcdef' readUIntBE(缓冲区) 从缓冲区返回整数值作为大端。 var buffer = new Buffer([0x00, 0x00, 0x10]); buffer_u
node-sass和sass-loader是两个常用的web开发工具,它们用于将Sass(CSS预处理器)代码编译为浏览器可识别的CSS代码。 node-sass是一个Node.js模块,它是用C ++实现的原生Node模块,用于将Sass代码编译为CSS。其优势在于速度快、占用内存少,因此是许多前端工程师的首选。在使用node-sass的过程中,需要指定要处理文件文件夹,同时需要配置输出目录及其他参数。 而sass-loader则是webpack中的一个loader,它可以将Sass代码编译为CSS,并将其注入到webpack打包后的应用程序中。使用sass-loader时,需要在webpack配置中添加sass-loader及相关配置,以指定Sass代码的输入路径、输出路径、loader的缓存等。 node-sass和sass-loader的版本选择需要注意兼容性。一般来说,node-sass的版本应与sass-loader的版本相对应,否则可能会出现编译错误等问题。同时,还需要注意node-sass的版本与Node.js的版本是否兼容,以避免在编译过程中出现错误。在使用时,可以通过npm安装最新版本的node-sass和sass-loader,并根据实际情况进行配置,以达到最佳性能和兼容性。