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

Nunjucks遍历用户API Keys数组无渲染异常问题求助

问题排查:Nunjucks无法遍历DynamoDB存储的api_keys数组

问题背景

基于Node.js开发的多人贪吃蛇服务器,用AWS DynamoDB存储用户API密钥(api_keys字段为字符串数组)。生成密钥、登录注册功能正常,用模板内预设的数组能正常循环渲染表格,但换成从DynamoDB取出的user.api_keys时:

  • 无任何报错,但表格为空
  • {{ user.api_keys | dump }}能正确输出数组内容
  • 直接取{{ user.api_keys[0] }}无内容,预设数组则正常

核心原因:DynamoDB返回的不是JS原生数组

DynamoDB低阶API返回的数组通常是包装过的特殊类型对象(比如DynamoDB的List类型),而非JS原生Array。Nunjucks的for...in循环仅支持遍历原生可迭代对象(数组、字符串、Map等),虽然dump过滤器能把对象序列化成JSON字符串显示,但实际对象本身不具备原生数组的可迭代性,也无法通过索引直接访问元素。

解决方案

1. 改用AWS SDK的DocumentClient获取数据

AWS SDK提供的DocumentClient会自动把DynamoDB的原生类型(List、Map)转换为对应的JS原生类型(Array、Object),是最省心的方案:

const { DynamoDB } = require('aws-sdk');
const docClient = new DynamoDB.DocumentClient();

const getUser = async (userId) => {
  const result = await docClient.get({
    TableName: 'your-table-name',
    Key: { id: userId }
  }).promise();
  return result.Item; // 此处api_keys为原生JS数组
};

2. 手动转换非原生数组为JS数组

如果暂时无法切换到DocumentClient,在服务端拿到用户数据后,手动解析DynamoDB的类型格式:

// 针对DynamoDB String类型列表的转换
user.api_keys = user.api_keys.map(item => item.S);
// 通用转原生数组方案
user.api_keys = JSON.parse(JSON.stringify(user.api_keys));

3. 模板内验证数据类型

可以在模板中添加调试代码,确认user.api_keys的实际类型:

{{ user.api_keys.constructor.name }} <!-- 正常应显示"Array",否则说明类型异常 -->

4. 服务端强制转数组后传模板

在把用户数据传给Nunjucks模板前,强制转换为原生数组:

// 路由处理示例
res.render('developers', {
  user: {
    ...user,
    api_keys: Array.from(user.api_keys) // 强制转为原生数组
  }
});

内容的提问来源于stack exchange,提问作者SoJS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:05:04