Home > Software design >  Cannot import csv-parse on lambda in nodejs 12
Cannot import csv-parse on lambda in nodejs 12

Time:12-27

I am writing a code which requires csv-parse on lambda. Runtime is node 12.x.

I installed following modules via npm 6.14.10 (node v12.20.1)

{
  "name": "data_analysis_node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "aws-sdk": "^2.1282.0",
    "csv-parse": "^5.3.3",
    "fs": "0.0.1-security"
  }
}

Then I zipped a node_modules directory, upload it, attached it to a layer, applyed the layer to the function and wrote a following code.

index.js

const AWS = require('aws-sdk');
const parse = require('csv-parse/lib/sync'); 
const fs = require('fs');

exports.handler = async (event) => {
    console.log('fine')
};

but it has not been working and showing following errors.

2022-12-26T14:28:45.472Z    undefined   ERROR   Uncaught Exception  {
"errorType":"Runtime.ImportModuleError"
,"errorMessage":"Error: Cannot find module 'csv-parse/lib/sync'\nRequire 
stack:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js","stack":["Runtime.ImportModuleError: Error: Cannot find module 'csv-parse/lib/sync'","Require stack:","- /var/task/index.js","- /var/runtime/UserFunction.js","- 
/var/runtime/index.js","    at _loadUserApp (/var/runtime/UserFunction.js:100:13)","    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)","    at Object.<anonymous> (/var/runtime/index.js:43:30)","    at Module._compile (internal/modules/cjs/loader.js:999:30)","    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)","    at Module.load (internal/modules/cjs/loader.js:863:32)","    at Function.Module._load (internal/modules/cjs/loader.js:708:14)","    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)","    at internal/main/run_main_module.js:17:47"]}

I re-checked the inside the node_modules, and I confirmed the path to csv-parse is correct.

enter image description here

I also commented out the line imports csv-parse, and it didn't output any errors and seemed importing other modules fine.

const AWS = require('aws-sdk');
//const parse = require('csv-parse/lib/sync'); 
const fs = require('fs');

exports.handler = async (event) => {
    console.log('fine')
};

I have been stacked 3 to 4 hours, so any suggestion are helpful.

CodePudding user response:

When creating a Lambda layer for NodeJS, structure in your zip file should be nodejs/node_modules/ and not just node_modules/ Optionally, for multiple versions, you can put nodejs/nodeXY/node_modules/ You can read more about Lambda layers in the documentation

CodePudding user response:

Would something like this work?

const csvParse = require('csv-parse');
// do whatever with csvParse

It may be that there is a naming collision with the csv-parse API

EDIT

According to the docs you need to require the parse module from csv-parse/sync, not csv-parse/lib/sync

The following should work:

const parse = require('csv-parse/sync');

I received the same error you did when requiring from csv-parse/lib/sync and it worked fine when required from csv-parse/sync

  • Related