我正在尝试将响应中的多个对象作为json从一条路由发送回客户端。它是一种中间件,将被调用,然后调用它自己的另一条内部路由来获取数据并进行一些数据处理。这是代码:
const axios = require('axios');
var datetime = require('node-datetime');
function MiddlewareRoutes(router) {
var MiddlewareController = require('../controllers/MiddlewareController')
router.route('/Middleware/someotherLink/parametres').get(function(req,res,next) {
console.log(req.params.id, req.params.startTime, req.params.endTime);
url = `http://localhost:hidden/link/..`;
url2 = "http://localhost:port+params..."
axios.get(url) //, {responseType: 'json',}
.then(response => {
var formattedData = formatData(response.data);
[max,min] = getMinMax(formattedData);
res.write("max:",max);
res.write("min:",min);
res.write(formattedData);
res.end();
})
.catch(error => {
console.log(error);
});
})
}
但是,我得到了错误:
TypeError: First argument must be a string or Buffer
at write_ (_http_outgoing.js:642:11)
at ServerResponse.write (_http_outgoing.js:617:10)
at axios.get.then.response (C:\Users\U500405\Desktop\Backend\routes\MiddleWare.js:19:13)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
我在做什么错?我不能只发送字符串,因为我必须发送对象...
答案 0 :(得分:2)
Write用于将字符串写入响应正文,接受的参数为(chunk[, encoding][,callback])
,但是对象不是字符串,并且您的最小值/最大值不是编码。
如前所述,您可以使用JSON.stringify将对象转换为JSON字符串,但是由于这是非常常见的行为,Express提供了一种send方法就可以做到这一点。
res.write(JSON.stringify({
min,
max,
formattedData
}));
或
res.send({
min,
max,
formattedData
});
答案 1 :(得分:-1)
res.write(formattedData);
这里的格式化数据是一个对象。如错误消息所述,write需要一个字符串或Buffer对象,因此必须对其进行转换。通过这样做:res.write(JSON.stringify(formattedData))
。节点希望内容不是对象,因为它需要字符串来传递给服务器。服务器只能理解Nodejs Docs Nodejs Doc Link for res.write()中提到的纯文本输入,默认情况下,编码为'utf-8'。因此,当通过服务器发送对象时,服务器会丢弃该对象,并抛出预期的缓冲区块或字符串数据错误。