如何解决HapiJS接口调用Amazon DynamoDB JS SDK返回undefined问题
解决HapiJS路由返回DynamoDB值为undefined的问题
兄弟,我之前也踩过类似的坑!问题核心是异步操作没有正确处理——DynamoDB的SDK方法是异步的,而你可能没把它的结果正确传递到Hapi的路由handler里。结合你的Node.js 9.5.0和Hapi 16.6.2版本,给你一套可行的解决方案:
第一步:把CRUD-sessions里的DynamoDB操作改成返回Promise
旧版AWS SDK默认用回调,但async/await只认Promise,所以先把你的查询方法包装成Promise:
// CRUD-sessions.js const AWS = require('aws-sdk'); // 用DocumentClient更方便处理JSON数据 const dynamodb = new AWS.DynamoDB.DocumentClient(); // 假设你的获取最后一个session的方法 exports.getLastSession = () => { const params = { TableName: '你的表名', // 这里填你的查询条件,比如按主键查询或者用Scan/Query // 示例:Query最近的session,假设你有timestamp字段 KeyConditionExpression: 'userId = :uid', ExpressionAttributeValues: { ':uid': '某个用户ID' }, ScanIndexForward: false, // 倒序取最新的 Limit: 1 }; // 关键!调用promise()方法把回调式操作转成Promise return dynamodb.query(params).promise(); };
第二步:在Hapi路由里正确用async/await处理
Hapi 16.x已经支持async/await,但要注意handler的写法——要么直接返回Promise,要么用reply()传递结果:
// route.js const Hapi = require('hapi'); const { getLastSession } = require('./CRUD-sessions'); const server = new Hapi.Server(); server.connection({ port: 3000 }); server.route({ method: 'GET', path: '/retrieveLastSession', // 用async标记handler,这样就能用await了 handler: async (request, reply) => { try { // 等待DynamoDB的Promise完成,拿到结果 const result = await getLastSession(); // 注意:DynamoDB的Query/Scane结果在Items数组里,GetItem在Item属性里 // 这里根据你的实际操作调整,比如Query的话取第一个元素 const myLastSession = result.Items[0] || null; // 把结果返回给客户端 return reply(myLastSession); } catch (err) { // 处理错误,返回500状态码 return reply(err.message).code(500); } } }); server.start(err => { if (err) throw err; console.log(`Server running at ${server.info.uri}`); });
为什么之前会返回undefined?
大概率是这两个原因之一:
- 你的DynamoDB方法没有返回Promise:如果原来的代码用的是回调,回调里的
return根本传不到外层函数,导致await拿到的是undefined。 - 没正确取DynamoDB的返回数据:DynamoDB的响应不是直接返回数据,而是包裹在
Item(GetItem)或Items(Query/Scan)里,直接拿整个响应对象可能会误以为没有数据。
测试一下这套代码,应该就能正常返回DynamoDB里的session数据了!
内容的提问来源于stack exchange,提问作者JALCEJ
相关产品推荐
相关产品推荐

