Node.js SvelteKit端点:从节点/Express转换

Node.js SvelteKit端点:从节点/Express转换,node.js,express,svelte,node-postgres,sveltekit,Node.js,Express,Svelte,Node Postgres,Sveltekit,SvelteKit新手,致力于从Node/Express服务器调整端点,使其更通用,以便能够利用SvelteKit适配器。端点通过节点postgresql下载存储在数据库中的文件 Node/Express中的功能端点如下所示: 从“流”导入流 从“../utils/db”导入数据库 导出异步函数下载(req、res){ const_id=req.params.id const sql=“从文件中选择_id、名称、类型和数据,其中_id=$1;” const{rows}=await db.quer

SvelteKit新手,致力于从Node/Express服务器调整端点,使其更通用,以便能够利用SvelteKit适配器。端点通过节点postgresql下载存储在数据库中的文件

Node/Express中的功能端点如下所示:

从“流”导入流
从“../utils/db”导入数据库
导出异步函数下载(req、res){
const_id=req.params.id
const sql=“从文件中选择_id、名称、类型和数据,其中_id=$1;”
const{rows}=await db.query(sql,[\u id])
常量文件=行[0]
const fileContents=Buffer.from(file.data,“base64”)
const readStream=new stream.PassThrough()
readStream.end(文件内容)
res.set('Content-disposition','attachment;filename=${file.name}`)
res.set('Content-Type',file.Type)
readStream.pipe(res)
}
以下是我在SvelteKit中为[filenum].json.ts提供的内容

从“流”导入流
从“$lib/db”导入数据库
导出异步函数get({params}):Promise

我们不与您可能熟悉的节点http模块或Express等框架中的req/res对象交互,因为它们仅在某些平台上可用。相反,SvelteKit将返回的对象转换为您部署应用程序的平台所需的任何内容


虽然目前SvelteKit中有一个bug,但我能够使用一个解决方法

//src/routes/api/file/\u file.controller.ts
从“../\u db”导入{query}
键入GetFileResponse=(fileNumber:string)=>Promise
export const getFile:GetFileResponse=async(fileNumber:string)=>{
const{rows}=wait query(`SELECT_-id、name、type、文件中的数据,其中_-id=$1;`,[fileNumber])
如果(行){
常量文件=行[0]
返回{
标题:{
'内容处置':`attachment;filename=“${file.name}`,
//“内容类型”:file.Type//无法使用我的MIME类型
“内容类型”:“应用程序/八位字节流”//解决方法
},
正文:新Uint8Array(file.data)
}
}else返回{//不需要(如果没有返回任何内容,则SvelteKit返回404)
现状:404
}
}

//src/routes/api/file/[filenum].ts
从'@sveltejs/kit'导入类型{RequestHandler}
从“/_file.controller”导入{getFile}
export const get:RequestHandler=async({params})=>{
const{filenum}=params
const fileResponse=wait getFile(filenum)
返回文件响应
}

为什么要删除节点依赖项?端点在服务器上运行,对于所有适配器(静态适配器除外)而言,服务器都将在节点环境中运行,“我们不与您可能熟悉的Node http模块或Express等框架中的req/res对象交互,因为它们仅在某些平台上可用。相反,SvelteKit会将返回的对象转换为您部署应用程序的平台所需的任何内容。“是的,但这并不意味着您无法访问其他节点功能,只是SvelteKit抽象掉了req/res部分。由于get方法中没有res,因此不知道如何调用readStream.pipe(res).把它放入另一个临时变量中?