Home > Blockchain >  "The original argument must be of type function" ERROR for promisifying client.zrem?
"The original argument must be of type function" ERROR for promisifying client.zrem?

Time:07-19

I am making a cron job instance that is running using Node to run a job that removes posts from my Redis cache.

I want to promisify client.zrem for removing many posts from the cache to insure they are all removed but when running my code I get the error below on line: "client.zrem = util.promisify(client.zrem)"

"TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function. Received undefined"

I have another Node instance that runs this SAME CODE with no errors, and I have updated my NPM version to the latest version, according to a similar question for this SO article but I am still getting the error.

TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type Function. Received type undefined

Any idea how I can fix this?

const Redis = require("redis")
const util = require(`util`)
const client = Redis.createClient({
  url: process.env.REDIS,
})

client.zrem = util.promisify(client.zrem) // ERROR THROWN HERE

// DELETE ONE POST
const deletePost = async (deletedPost) => {
  await client.zrem("posts", JSON.stringify(deletedPost))
}

// DELETES MANY POSTS
const deleteManyPosts = (postsToDelete) => {
  postsToDelete.map(async (post) => {
    await client.zrem("posts", JSON.stringify(post))
  })
}

module.exports = { deletePost, deleteManyPosts }


CodePudding user response:

Node Redis 4.x introduced several breaking changes. Adding support for Promises was one of those. Renaming the methods to be camel cased was another. Details can be found at in the README in the GitHub repo for Node Redis.

You need to simply delete the offending line and rename the calls to .zrem to .zRem.

I've also noticed that you aren't explicitly connecting to Redis after creating the client. You'll want to do that.

Try this:

const Redis = require("redis")
const client = Redis.createClient({
  url: process.env.REDIS,
})

// CONNECT TO REDIS
// NOTE: this code assumes that the Node.js version supports top-level await
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();  // 

// DELETE ONE POST
const deletePost = async (deletedPost) => {
  await client.zRem("posts", JSON.stringify(deletedPost))
}

// DELETES MANY POSTS
const deleteManyPosts = (postsToDelete) => {
  postsToDelete.map(async (post) => {
    await client.zRem("posts", JSON.stringify(post))
  })
}

module.exports = { deletePost, deleteManyPosts }
  • Related