Nodejs 缺少来自 HTTP 请求的数据
Nodejs Missing Data From HTTP Request
我目前正在尝试从 HTTP 请求中获取文件,然后将数据写入文件(在本例中为 PDF)。
使用以下方法我可以生成有效的 PDF,但我发送的文件有几行,但我创建的文件是空白的。
我用来尝试获取数据的函数:
async function getDataFromReq(req){
let body = '';
await req.on('data', (chunk) => {
body += chunk;
});
return body;
}
我对该函数的实现并将其写入文件:
let file = await getDataFromReq(req);
await writeFile(fileName,file);
我的写入文件功能:
async function writeFile(fileName,file){
fs.writeFileSync('./'+fileName, file);
}
注:
我能够使用 King Friday 的解决方案,但我采纳了 Quentins 的建议并使用现有的库来完成任务,而不是重新发明轮子。我按照本指南使用了 multer - https://bezkoder.com/node-js-express-file-upload/
- 你只能等待一个承诺
req.on
没有 return 承诺
您需要:
- 去掉
getDataFromReq
里面的await
- 从
getDataFromReq
的声明中去掉async
(除非你在其中使用await
,否则没有意义)
- 明确地 return 来自
getDataFromReq
的 new Promise
- 为传入数据完成传入时注册一个处理程序 (
req.on('end', ...
)。
resolve
处理程序中的承诺
但是,不重新发明轮子可能会更容易。 reading files and making HTTP requests.
已经有基于承诺的模块
像这样
const { promises as fs } = require('fs');
function getDataFromReq(req) {
return new Promise((resolve, reject) => {
let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
resolve(body);
});
req.on('error', err => {
reject(err);
});
});
});
然后你可以像这样在异步方法中使用...
const body = await getDataFromReq(req);
await fs.writeFile(fileName, body);
我目前正在尝试从 HTTP 请求中获取文件,然后将数据写入文件(在本例中为 PDF)。
使用以下方法我可以生成有效的 PDF,但我发送的文件有几行,但我创建的文件是空白的。
我用来尝试获取数据的函数:
async function getDataFromReq(req){
let body = '';
await req.on('data', (chunk) => {
body += chunk;
});
return body;
}
我对该函数的实现并将其写入文件:
let file = await getDataFromReq(req);
await writeFile(fileName,file);
我的写入文件功能:
async function writeFile(fileName,file){
fs.writeFileSync('./'+fileName, file);
}
注:
我能够使用 King Friday 的解决方案,但我采纳了 Quentins 的建议并使用现有的库来完成任务,而不是重新发明轮子。我按照本指南使用了 multer - https://bezkoder.com/node-js-express-file-upload/
- 你只能等待一个承诺
req.on
没有 return 承诺
您需要:
- 去掉
getDataFromReq
里面的await
- 从
getDataFromReq
的声明中去掉async
(除非你在其中使用await
,否则没有意义) - 明确地 return 来自
getDataFromReq
的 - 为传入数据完成传入时注册一个处理程序 (
req.on('end', ...
)。 resolve
处理程序中的承诺
new Promise
但是,不重新发明轮子可能会更容易。 reading files and making HTTP requests.
已经有基于承诺的模块像这样
const { promises as fs } = require('fs');
function getDataFromReq(req) {
return new Promise((resolve, reject) => {
let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
resolve(body);
});
req.on('error', err => {
reject(err);
});
});
});
然后你可以像这样在异步方法中使用...
const body = await getDataFromReq(req);
await fs.writeFile(fileName, body);