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

Node.js 8.10编写Lambda无法向DynamoDB插入数据求助

问题分析与解决方案

嘿,我一眼就看出问题所在了——你的Node.js 8.10代码虽然用了async标记处理函数,但还是沿用了旧的回调写法,而且没有正确等待异步操作完成,导致Lambda函数提前结束,自然返回null,甚至可能数据库插入操作还没跑完就被终止了。

两种正确的修改方式

方式1:用Promise+await(推荐,更符合Node.js 8+的风格)

AWS SDK从Node.js 8.x开始原生支持Promise接口,你只需要把put方法改成Promise形式,用await等待它完成就行:

var AWS = require('aws-sdk');
// 设置区域
AWS.config.update({region: 'us-east-1'});
var documentClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = async (event) => {
    const params = {
        Item: {
            client: `client_${Math.random()}`,
            Type: 1,
            Status: true,
            json: {
                foo: 'bar',
                address:{
                    city:'Pune',
                    street: 'ABC Nagar',
                    pin:'411099'
                }
            }
        },
        TableName: 'clients'
    };

    try {
        const data = await documentClient.put(params).promise();
        console.log("插入成功", data);
        return "Hi, insert data completed";
    } catch (err) {
        console.log("插入失败", err);
        throw err; // 抛出错误让Lambda处理错误返回逻辑
    }
};

方式2:手动封装Promise(兼容旧回调写法)

如果你暂时不想改回调结构,可以手动把put的回调封装成Promise,让Lambda等待这个Promise完成:

var AWS = require('aws-sdk');
// 设置区域
AWS.config.update({region: 'us-east-1'});
var documentClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = async (event) => {
    const params = {
        Item: {
            client: `client_${Math.random()}`,
            Type: 1,
            Status: true,
            json: {
                foo: 'bar',
                address:{
                    city:'Pune',
                    street: 'ABC Nagar',
                    pin:'411099'
                }
            }
        },
        TableName: 'clients'
    };

    return new Promise((resolve, reject) => {
        documentClient.put(params, (err, data) => {
            if (err) {
                console.log("插入失败", err);
                reject(err);
            } else {
                console.log("插入成功", data);
                resolve("Hi, insert data completed");
            }
        });
    });
};

为啥旧版本(Node.js 6.10)能正常工作?

因为Node.js 6.10的Lambda用的是回调模式,你通过callback函数明确告诉Lambda:“我做完了,现在返回结果/错误”。而async函数本质是Promise的语法糖,Lambda会等待函数返回的Promise完成——但你原来的8.10代码既没返回Promise,也没await异步操作,函数执行到末尾就直接结束了,后面的回调逻辑根本没机会跑完。

内容的提问来源于stack exchange,提问作者Mahammad Jilan Basha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:22:47