NodeJS+Lex开发存数据到DynamoDB遇Promisify is not a function错误
解决"Promisify is not a function"错误
你遇到的问题主要是es6-promisify的导入方式不正确,或者也可以直接改用Node.js内置的工具方法来避免第三方包的依赖问题。我给你整理了两种可行的解决方案:
方案1:修正es6-promisify的导入方式
es6-promisify的默认导出是promisify函数,但在Node.js的CommonJS语法(require)中,你需要显式获取它的default属性才能正确使用。修改你的导入代码:
const promisify = require('es6-promisify').default;
这样就能正确拿到promisify函数,不会再出现"is not a function"的报错了。
方案2:改用Node.js内置的util.promisify(推荐)
从Node.js v8.0.0开始,util模块就内置了promisify方法,完全不需要依赖第三方包,更稳定也符合Node.js的标准用法。具体步骤如下:
- 替换导入语句,移除
es6-promisify的依赖:
const { promisify } = require('util');
- 另外,你的代码里还有一个小问题:
catch块里的Promise.reject(error)没有返回值,会导致错误被静默吞掉,应该改为return Promise.reject(error)或者直接throw error。
修改后的完整代码:
'use strict'; const uuidV1 = require('uuid/v1'); const AWS = require('aws-sdk'); const { promisify } = require('util'); // 改用内置util的promisify const dynamo = new AWS.DynamoDB.DocumentClient(); module.exports.saveBookingToDatabase = function(Arrival_city, Departure_city, Flight_type, Phone_number){ console.log('saveBookingToDatabase'); const item = {}; item.bookingId = uuidV1(); item.arrivalCity = Arrival_city; item.departureCity = Departure_city; item.classType = Flight_type; item.phone = Phone_number; const params = { TableName: 'airstallion', Item: item }; const putAsync = promisify(dynamo.put, dynamo); return putAsync(params) .then(() => { console.log(`Saving ticket ${JSON.stringify(item)}`); return item; }) .catch(error => { return Promise.reject(error); // 必须返回,避免错误丢失 // 或者直接写 throw error; }); }
如果你的Node.js版本在v10及以上,还可以用async/await让代码更简洁易读:
'use strict'; const uuidV1 = require('uuid/v1'); const AWS = require('aws-sdk'); const { promisify } = require('util'); const dynamo = new AWS.DynamoDB.DocumentClient(); const putAsync = promisify(dynamo.put, dynamo); module.exports.saveBookingToDatabase = async function(Arrival_city, Departure_city, Flight_type, Phone_number){ console.log('saveBookingToDatabase'); const item = { bookingId: uuidV1(), arrivalCity: Arrival_city, departureCity: Departure_city, classType: Flight_type, phone: Phone_number }; const params = { TableName: 'airstallion', Item: item }; try { await putAsync(params); console.log(`Saving ticket ${JSON.stringify(item)}`); return item; } catch (error) { console.error('Error saving booking:', error); throw error; } }
内容的提问来源于stack exchange,提问作者Tayyab
相关产品推荐
相关产品推荐

