W
Wasp-lang2mo ago
Mohan

sample code for reading a document from db and parsing it to json from the action

sample code for reading a document from db and parsing it to json from the action
9 Replies
kapa.ai
kapa.ai2mo ago
Hi @Mohan. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- In Wasp, you can create actions to interact with your database. Here is an example of how you can create an action to read a task from a database:
import { type CreateTask, type MarkTaskAsDone } from 'wasp/server/operations'

type Task = {
id: number
description: string
isDone: boolean
}

// our "database"
let nextId = 4
const tasks = [
{ id: 1, description: 'Buy some eggs', isDone: true },
{ id: 2, description: 'Make an omelette', isDone: false },
{ id: 3, description: 'Eat breakfast', isDone: false },
]

// The 'args' object is something sent by the caller (most often from the client)
export const markTaskAsDone: MarkTaskAsDone<Pick<Task, 'id'>, void> = (
args
) => {
const task = tasks.find((task) => task.id === args.id)
if (!task) {
// We'll show how to properly handle such errors later
return
}
task.isDone = true
}
import { type CreateTask, type MarkTaskAsDone } from 'wasp/server/operations'

type Task = {
id: number
description: string
isDone: boolean
}

// our "database"
let nextId = 4
const tasks = [
{ id: 1, description: 'Buy some eggs', isDone: true },
{ id: 2, description: 'Make an omelette', isDone: false },
{ id: 3, description: 'Eat breakfast', isDone: false },
]

// The 'args' object is something sent by the caller (most often from the client)
export const markTaskAsDone: MarkTaskAsDone<Pick<Task, 'id'>, void> = (
args
) => {
const task = tasks.find((task) => task.id === args.id)
if (!task) {
// We'll show how to properly handle such errors later
return
}
task.isDone = true
}
(Source: Wasp Docs (https://wasp-lang.dev/docs/data-model/operations/actions#implementing-actions-in-node)) In this example, markTaskAsDone is an action that finds a task by its id and marks it as done. The tasks are stored in a simple array for the sake of this example, but in a real application, you would interact with your database here. As for parsing the document to JSON, Wasp uses superjson (https://github.com/blitz-js/superjson) under the hood, which means you're not limited to only sending and receiving JSON payloads. You can send and receive any superjson-compatible payload (like Dates, Sets, Lists, circular references, etc.) and let Wasp handle the (de)serialization. Please note that the above code is a simplified example and might not cover all your needs. For more complex scenarios, you might need to use Prisma, which is the default database client for Wasp. You can find more information about it in the Wasp Docs (https://wasp-lang.dev/docs/data-model/backends#writing-a-seed-function). ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @Mohan, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
Mohan
Mohan2mo ago
@kapa.ai lets say if i do findunique what is the return type i get and how do i parse it to json
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- In Wasp, when you use the findUnique function from Prisma, the return type is a Promise that resolves to the instance of the model you're querying for, or null if no record is found. Here's an example of how you might use it:
const task = await Task.findUnique({ where: { id: args.id } })
const task = await Task.findUnique({ where: { id: args.id } })
In this case, task would be an instance of the Task model, or null if no task with the provided id was found. To convert this to JSON, you can use the JSON.stringify() function in JavaScript:
const taskJson = JSON.stringify(task)
const taskJson = JSON.stringify(task)
This will give you a JSON string representation of the task. If you want to convert this back to an object, you can use JSON.parse():
const taskObject = JSON.parse(taskJson)
const taskObject = JSON.parse(taskJson)
Please note that this is standard JavaScript functionality and doesn't have anything specific to do with Wasp or Prisma. The JSON.stringify() and JSON.parse() functions are used to convert between JSON and JavaScript objects. (Source: Wasp Docs (https://wasp-lang.dev/docs/data-model/crud#declaring-a-crud-with-default-options)) ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @Mohan, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
Mohan
Mohan2mo ago
@kapa.ai I have this const post = await context.entities.PostComments.findUnique({ where: { postId: args.postId } })
If i do JSON.stringify(post) i get an error saying Argument of type '(GetResult<{ id: string; postId: string; comments: JsonValue; createdAt: Date; updatedAt: Date; }, unknown> & {}) | Promise<GetResult<{ id: string; postId: string; comments: JsonValue; createdAt: Date; updatedAt: Date; }, unknown> & {}>' is not assignable to parameter of type 'SetStateAction<any[]>'. @kapa.ai ?
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- I'm sorry, but your question seems to be incomplete. Could you please provide more details or context? I'm here to help with any questions related to Wasp, a Rails-like framework for React, Node.js, and Prisma. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @Mohan, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
Mohan
Mohan2mo ago
@kapa.ai I have this const post = await context.entities.PostComments.findUnique({ where: { postId: args.postId } }) If i do JSON.stringify(post) i get an error saying Argument of type '(GetResult<{ id: string; postId: string; comments: JsonValue; createdAt: Date; updatedAt: Date; }, unknown> & {}) | Promise<GetResult<{ id: string; postId: string; comments: JsonValue; createdAt: Date; updatedAt: Date; }, unknown> & {}>' is not assignable to parameter of type 'SetStateAction<any[]>'
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- The error message you're seeing is typically associated with a mismatch between the expected type and the actual type of a value in TypeScript. It seems like you're trying to use the result of JSON.stringify(post) as the argument to a state setter function in React (like setState), but the types don't match. The findUnique function returns a Promise that resolves to the instance of the model you're querying for, or null if no record is found. When you use await with findUnique, it should return the instance of the model or null, not a Promise. Here's how you might handle this:
const post = await context.entities.PostComments.findUnique({
where: { postId: args.postId }
})

if (post) {
const postJson = JSON.stringify(post)
// Use postJson here
} else {
// Handle the case where no post was found
}
const post = await context.entities.PostComments.findUnique({
where: { postId: args.postId }
})

if (post) {
const postJson = JSON.stringify(post)
// Use postJson here
} else {
// Handle the case where no post was found
}
In this code, postJson is a string. If you're trying to use this as the new state in a call to a state setter function (like setState), you'll need to parse it back into an object with JSON.parse():
setState(JSON.parse(postJson))
setState(JSON.parse(postJson))
This assumes that your state is supposed to be an object. If your state is supposed to be an array, you'll need to ensure that postJson is an array, or convert it to an array before calling setState. Please note that this is a general JavaScript/TypeScript issue and doesn't have anything specific to do with Wasp or Prisma. If you're still having trouble, you might want to check the TypeScript types of your state and the result of findUnique to make sure they match. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @Mohan, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
Mohan
Mohan2mo ago
@kapa.ai so json.stringify made it into string but instead i have to read a key called comments which has array how do i do it
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- If you have a post object and you want to access a key called comments which is an array, you can do it directly without needing to convert the object to a JSON string. Here's how you can do it:
const post = await context.entities.PostComments.findUnique({
where: { postId: args.postId }
})

if (post) {
const comments = post.comments
// Now you can work with `comments` array
} else {
// Handle the case where no post was found
}
const post = await context.entities.PostComments.findUnique({
where: { postId: args.postId }
})

if (post) {
const comments = post.comments
// Now you can work with `comments` array
} else {
// Handle the case where no post was found
}
In this code, comments is an array extracted from the post object. You can now loop through it, map it, or do whatever you need to do with this array. If for some reason you have a JSON string and you need to parse it back to an object to access the comments, you can do it like this:
const postJson = JSON.stringify(post)
const postObject = JSON.parse(postJson)
const comments = postObject.comments
const postJson = JSON.stringify(post)
const postObject = JSON.parse(postJson)
const comments = postObject.comments
In this code, postJson is a JSON string, postObject is the parsed object, and comments is the array extracted from the object. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @Mohan, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?