fastify / fastify/fast-json-stringify

When `asString` receives `undefined` an exception is thrown

Open
#680 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
3.7k
Forks
226
Avg merge
1d 59m
Merged PRs (30d)
3

Description

### Prerequisites

- [X] I have written a descriptive issue title
- [X] I have searched existing issues to ensure the bug has not already been reported

### Fastify version

4.24.3

### Plugin version

5.9.1

### Node.js version

20.2.0

### Operating system

Linux

### Operating system version (i.e. 20.04, 11.3, 10)

Ubuntu 22.04.1

### Description

Not entirely sure this is a bug, could be intended behavior.

I have an array of stings, however one of the elements is `undefined`.

```
['test1', 'test2', 'test3', undefined]
```

If I return that from a fastify endpoint, `asString` throws an exception:

```
TypeError: Cannot read properties of undefined (reading 'toString')
at Serializer.asString (/repo/node_modules/fast-json-stringify/lib/serializer.js:113:19)
at anonymous1 (eval at build (/repo/node_modules/fast-json-stringify/index.js:190:23), :17:28)
at anonymous0 (eval at build (/repo/node_modules/fast-json-stringify/index.js:190:23), :52:19)
at serialize (/repo/node_modules/fastify/lib/reply.js:896:12)
at preSerializationHookEnd (/repo/node_modules/fastify/lib/reply.js:516:17)
at preSerializationHook (/repo/node_modules/fastify/lib/reply.js:500:5)
at Reply.send (/repo/node_modules/fastify/lib/reply.js:204:7)
at /repo/node_modules/fastify/lib/wrapThenable.js:25:15
```

Possibly related:
https://github.com/fastify/fast-json-stringify/issues/218
https://github.com/fastify/fast-json-stringify/pull/84

### Steps to Reproduce

```typescript
export default async (app: FastifyInstance) => {
app.route({
method: 'GET',
url: '/test',
schema: {
response: {
200: {
type: 'object',
properties: {
status: { type: 'string' },
message: { type: 'string' },
testArray: {
type: 'array',
items: { type: 'string' }
}
}
}
}
},
handler: async () => {
return {
status: 'ok',
message: 'This is a test route',
testArray: ['test1', 'test2', 'test3', undefined]
}
}
})
}
```

### Expected Behavior

It seems that `asString` will default the input to an empty string if its `null`.

https://github.com/fastify/fast-json-stringify/blob/74c35c0ee4c2dd12cc8edf8acad4b2f46c0542bb/lib/serializer.js#L103

I can confirm this behavior by sending `['test1', 'test2', 'test3', null]` instead. No error is thrown, and my response looks like the following:

```
{
"status": "ok",
"message": "This is a test route",
"testArray": [
"test1",
"test2",
"test3",
""
]
}
```

I'm thinking that `asString` should check for `undefined` as well. However I understand that this may technically be incorrect because my response schema defines an array of strings, not `Array`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.