背景
我正在将一个create-react-app应用程序转换为nextjs,我的大部分工作是确保现有组件可以为SSR工作。
我有一个组件抛出构建错误:
Error: text.split is not a function
对于此函数的最终条件:
function createRender(text, type, size, paragraphs, inline, nogap, url) {
let renderObj;
if (text) {
// if text is an array, return a string of the array
if (text instanceof Array) {
text = text.join('');
}
if (type === "title") {
renderObj = <h2>{text}</h2>
} else if (paragraphs === true) {
renderObj = text.split('\n').map((paragraph, index) => {
if (paragraph !== "") {
return <p>{paragraph}</p>
}
})
} else {
renderObj = text.split('\n').map((paragraph, index) => {
if (paragraph !== "") {
return <p >{paragraph}</p>
}
})
}
}
return renderObj
}
问题
这个拆分请求(就我所见)与它前面的条件中的请求相同,不会抛出错误。
这不是在运行时传递非字符串时发生的错误,而是构建错误。
我遗漏了什么可能导致文本在这个条件下抛出这个错误?在我以前使用javascript的经验中,我只会在运行时得到一个错误,并且一个不是字符串的变量试图被拆分。
还有,为什么它没有在上面的条件中引起错误,使用完全相同的代码?如果我删除最后一个'else'条件,我就不会得到错误。
警告
忽略条件中的逻辑,我已经删除了一些细节,以使其以最小的形式重现。
我使用的是nextjs13和它的app文件夹,我是nextjs的新手,看到这是一个实验性的功能,所以我不确定是不是这个功能的外部因素导致了这个问题。
更新1
我发现,如果我在finalelse中添加一个已定义的条件,就不会抛出这个错误。
} else {
renderObj = text.split('\n').map((paragraph, index) => {
if (paragraph !== "") {
return <p >{paragraph}</p>
}
})
}
与
} else (any variable === anything) {
renderObj = text.split('\n').map((paragraph, index) => {
if (paragraph !== "") {
return <p >{paragraph}</p>
}
})
}
条件定义是任意的,我可以放置size === 'melon'
,它不再抛出错误。
1条答案
按热度按时间9udxz4iz1#
我太习惯于客户端呈现,并且仍然使用这样的观点,即函数和变量只有在构建时出现错误代码时才会抛出错误。
然而,因为这个函数是为SSR构建的,它被传递了实际的真实的变量,并且抛出了一个错误,就像我在CSR上运行时所熟悉的那样。
所以问题是捕捉一个错误的变量,它应该是一个字符串,但实际上不是。