You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中持久化crypto.randomUUID生成的用户唯一ID方案

问题根因

当前逻辑每次触发getProducts接口都会无条件执行crypto.randomUUID()生成新ID,既没有判断用户是否已经被分配过ID,也没有在HTTP请求链路中做已分配ID的回读校验,所以每次刷新页面都会拿到新的ID,无法固定。

实现方案

采用HttpOnly Cookie存储用户唯一标识是最适配需求的方案,完全满足无需用户登录、不依赖IP识别的要求,也是匿名用户身份识别的通用工业实践:

  • 浏览器同域名下的所有请求会自动携带对应Cookie,服务端可直接读取校验
  • 可自定义Cookie有效期,用户不主动清除浏览器数据的情况下ID可长期固定
  • 支持配置HttpOnly属性,避免前端JS篡改、XSS窃取标识,安全性优于纯localStorage存储

服务端改造步骤

  1. 安装Cookie解析依赖(未安装时执行)
npm install cookie-parser
  1. 在Express服务入口文件注册Cookie解析中间件
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册中间件,需放在路由注册之前
app.use(cookieParser());
  1. 修改getProducts接口逻辑,优先读取请求中已携带的用户ID,不存在时才生成新ID并写入Cookie
import Product from '../models/Products';
const crypto = require('crypto');

const getProducts = async (req, res) => {
  const products = await Product.find().lean();

  // 优先从Cookie中读取已分配的用户ID
  let idValueUser = req.cookies?.userId;
  if (!idValueUser) {
    // 无已存ID才生成新UUID
    idValueUser = crypto.randomUUID();
    // 将新ID写入Cookie,有效期设置为1年
    res.cookie('userId', idValueUser, {
      httpOnly: true,
      maxAge: 365 * 24 * 60 * 60 * 1000,
      sameSite: 'lax',
      secure: process.env.NODE_ENV === 'production' // HTTPS生产环境开启安全校验
    });
  }

  res.render('products/products', { 
    layout: 'products-lyt',
    products: products, 
    userId: idValueUser
  });
};

module.exports = getProducts;

前端逻辑优化

不需要每次渲染都覆盖localStorage的值,仅在本地无缓存时写入即可:

<div class="container-fluid products-container">
    <div class="products-columns">
        {{#each products}}
        {{> products-partial }}
        {{/each}}
    </div>
    <p id="awadetest">{{userId}}</p>
</div>

<script>
    if (!localStorage.getItem('userId')) {
        const currentUserId = document.getElementById("awadetest").textContent.trim();
        localStorage.setItem("userId", currentUserId);
    }
</script>
方案效果

改造后用户首次访问时服务端生成UUID写入Cookie,后续刷新、重新打开页面发起请求时,浏览器会自动携带该Cookie,服务端识别到已有ID就直接复用,不会重复生成,数据库侧可以稳定关联同一用户的所有行为数据。

内容的提问来源于stack exchange,提问作者Steven León

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:24:16