我正在尝试渲染一个EJS模板,并使用节点包Request将数据传递给它。我在上一个项目中使用node-fetch没问题。
以下是一个快速摘录:
const fetchCurrentWeather = (url, res) => {
fetch(url)
.then(res => res.json())
.then(data => res.render('pages/weather', {
currentId: data.list
}))
.catch(err => {
console.log(err);
res.sendStatus(500);
});
}
这将使用API响应中的数据呈现EJS天气页面模板。
然而,在这个最新的项目中,我正在尝试使用Node Package Request来做同样的事情而我失败了。这是代码:
app.post('/', (req, res, next) => {
const paramOptions = {
url: 'https://api.foursquare.com/v2/venues/search',
method: 'GET',
qs: {
client_id: 'W033PDIYFI2TSAUO4L5ANUFOAUMZV32NUWNOF0NL0JS2E5W4',
client_secret: 'SM1ZI11XOMPVMEGMBZXSN3LGTLOBQCVGIM1SN4QAO0QTCSM1',
near: 'xxxxxx',
intent: 'browse',
radius: '15000',
query: 'pizza',
v: '20170801',
limit: 1
}
};
request(paramOptions, function(err, res, body) {
if(err) {
console.log(err)
} else {
res.render('pages/search'); //THIS WILL NOT WORK
console.log(body) // RETURNS DATA FROM API ENDPOINT
}
});
res.render('pages/search'); // THIS WILL WORK
});
有效的res.render()
超出了Request函数的范围,因此我无法从此Request函数访问返回的数据。当我console.log
请求函数的主体时,我确实在终端视图中返回了JSON数据,所以我知道Request正在工作,但我不确定如何将这些数据传递到EJS模板中,就像我一样我的fetch()
示例。
答案 0 :(得分:0)
有两个单独的res
参数,内部参数隐藏外部参数。更改此行中的名称:
request(paramOptions, function(err, res, body) {
这样的事情:
request(paramOptions, function(err, response, body) {
然后,当您致电res.render()
时,它将使用您想要的更高范围的。
您可能还需要将一些数据作为第二个参数传递给res.render(filename, data)
,以便将request()
的结果提供给渲染操作。
并且,在if (err)
条件下,您应该发送错误状态,可能是res.sendStatus(500)
。