Node fetch循环太慢

9 浏览
0 Comments

Node fetch循环太慢

我有一个API的js文件,我使用POST方法调用它,将一个包含网站URL的对象数组(大约26个对象或URL)作为请求体传入,通过下面的代码循环遍历这个数组(sites),检查每个对象的URL是否返回一个JSON,方法是在URL后面添加"/items.json",如果是,则将JSON内容推送到另一个最终数组siteLists中,并将其作为响应返回。

问题是,对于仅有的26个URL,这个API调用需要超过5秒才能完成,我是做错了还是fetch在Node.js中的工作方式就是这样?

const sites的内容如下:

[{label: "JonLabel", name: "Jon", url: "jonurl.com"},{...},{...}]

代码如下:

export default async (req, res) => {

if (req.method === 'POST') {

const body = JSON.parse(req.body)

const sites = body.list // 上面显示的内容

var siteLists = []

if (sites?.length > 0){

var b=0, idd=0

while (b < sites.length){

let url = sites?.[b]?.url

if (url){

let jurl = `${url}/items.json`

try {

let fUrl = await fetch(jurl)

let siteData = await fUrl.json()

if (siteData){

let items = []

let label = sites?.[b]?.label || ""

let name = sites?.[b]?.name || ""

let base = siteData?.items

if(base){

var c = 0

while (c < base.length){

let img = base[c].images[0].url

let titl = base[c].title

let obj = {

url: url,

img: img,

title: titl

}

items.push(obj)

c++

}

let object = {

id: idd,

name: name,

label: label,

items: items

}

siteLists.push(object)

idd++

}

}

}catch(err){

//console.log(err)

}

}

b++

}

res.send({ sites: siteLists })

}

res.end()

}

}

编辑:(解决方案)

所以,根据下面建议的使用promise的代码作为解决方案来看,它的运行速度更快,有趣的是,它仍然需要超过5秒才能加载,并且仍然会抛出错误:

Failed to load resource: the server responded with a status of 504 (Gateway Time-out)

因为Vercel,在那里托管应用程序的服务器端函数的超时设置为5秒,因此无法加载响应中的内容。在我没有超时限制的本地环境中,加载速度明显更快,但令我惊讶的是,这样的查询需要如此长的时间才能完成,它本应该是毫秒级的。

0