我使用 Express Generator 创建了一个 nodejs express 应用程序。
在其路由 index.js 中,我尝试使用标准库https://nodejs.org/api/http.html#http_http_get_options_callback中的默认 HTTP 模块进行 rest api 调用(我不想安装外部依赖项)和这将在视图中提供标题和欢迎文本的值。下面是 index.js 的代码。
var express = require('express');
var router = express.Router();
const http = require('http');
/* GET home page. */
router.get('/', function(req, res, next) {
let titletext = '';
let wtext = '';
http.get('http://localhost:5000/api/values', (apires) => {
const { statusCode } = apires;
const contentType = apires.headers['content-type'];
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
console.error(error.message);
// Consume response data to free up memory
apires.resume();
return;
}
apires.setEncoding('utf8');
let rawData = '';
apires.on('data', (chunk) => { rawData += chunk; });
apires.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
titletext=parsedData[1];
wtext=parsedData[0];
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
res.render('index', { title: titletext, data:wtext });
});
module.exports = router;
但它似乎不起作用,并且 titletext 和 wtest 以空字符串的形式出现。所以,我添加了三个断点。一个就在 get 调用之后,第二个在 get 调用响应到来之后,最后一个页面响应呈现调用(res.render)在最后。
现在,当我运行时,我发现调用了 get 调用断点,然后调用了页面响应渲染调用断点,最后调用了 get 调用响应断点,数据来自其余 api 但到那时页面渲染调用已经over,所以来自 api 调用的数据没有到达视图。
任何解决这个问题的想法都非常感谢
Http 请求调用是异步的,所以如果你把它放在res.render
GET 处理程序的末尾,它会在请求返回响应之前呈现空数据。
按照文档,您应该解析响应的正文并从end
事件处理程序呈现页面,例如:
router.get('/', function(req, res, next) {
let titletext = '';
let wtext = '';
http.get('http://localhost:5000/api/values', (apires) => {
const { statusCode } = apires;
const contentType = apires.headers['content-type'];
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
console.error(error.message);
// Consume response data to free up memory
apires.resume();
return;
}
apires.setEncoding('utf8');
let rawData = '';
apires.on('data', (chunk) => { rawData += chunk; });
apires.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
titletext=parsedData[1];
wtext=parsedData[0];
// Render page here
res.render('index', { title: titletext, data:wtext });
} catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
// Not here
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句