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
相关产品推荐
相关产品推荐

