如何在Node.js视图中返回promise



在我的后端,我对第三方网站进行了一个api调用,该调用返回了一个promise。我需要将这个承诺传递给一个html模板,但是在后端使用JSON.stringify((,然后在前端使用JSON.parse((是不起作用的。我收到这个错误:

JSON.parse:JSON数据的第1行第2列出现意外字符

所以我决定改变我的策略,从html模板向Node.js服务器发出获取请求。这是我当前的代码:

async function getItems() {
return await api.Items
...
}
app.get('/getItems', function(req, res){
res.end(Buffer.from(getItems()));
});

我遇到的问题是,即使使用Buffer:,我也无法用res.end返回承诺

TypeError[ERR_INVALID_ARG_TYPE]:第一个参数的类型必须是字符串或Buffer、ArrayBuffer、Array或类似Array的Object的实例。收到Promise 实例

我也尝试过:

app.get('/getItems', function(req, res){
getItems().then(result=> 
{
res.end(result);
}   
).catch(err => 
{
res.status(504);
}
)
});

然而,连接超时,状态为504。

如何使视图返回为承诺?

编辑:在第二个例子中,我得到承诺的结果,如果我将其设置为res.end('5'(,它不会超时。

再次编辑:

const items = fetch('127.0.0.1/api'); 
console.log(items);
for (const item of items) { console.log(item); }

响应{类型:"基本",url:"127.0.0.1/api",重定向:false,状态:200,确定:true,状态文本:"确定",标题:标题,正文:可读流,正文使用:false}

未捕获(承诺中(类型错误:项目不可迭代

您必须等待承诺得到解决,然后发送响应。有几种方法可以做到这一点:

app.get('/getItems', function(req, res){
getItems().then(result => {
res.json(result);
}).catch(err => {
console.log(err);
res.sendStatus(500);
});
});

这将以JSON的形式发送您的项目,这可能比发送缓冲区更有用。


或者,您可以像这样使用async/await

app.get('/getItems', async function(req, res){
try {
const result = await getItems();
res.json(result);
} catch(err) {
console.log(err);
res.sendStatus(500);
}
});

最新更新