即使在发送响应时也没有发送响应错误而获得API解析



我试图发送res.json后,我成功地将数据保存在数据库中,并保存上传的图像,但我不断得到API resolved without sending a response for /api/auth/registeration, this may result in stalled requests.。我也使用强大的图像上传在Next.js.

代码:

import connection from "../../../utils/connection/getConnection";
import formidable from "formidable";
const signupSchema = require("../../../models/signup");
import mkdirp from "mkdirp";
import bcrpt, { genSaltSync } from "bcrypt";
import fs from "fs";
export const config = {
api: {
bodyParser: false,
},
};
const handlePost = async (req, res) => {
const form = formidable.IncomingForm();
form.parse(req, async function (err, field, files) {
await fileSavour(field, files);
return res.json({
message: "success",
});
});
};
const fileSavour = async (fields, files) => {
let { email, password } = fields;
let imageName = files.image.name;
let newPassword = await bcrpt.hash(password, genSaltSync(10));
const newUser = new signupSchema({
email,
password: newPassword,
image: imageName,
});
const Nuser = await newUser.save();
if (Nuser) {
await mkdirp("public/profileImages/" + Nuser._id);
if (imageName) {
const data = fs.readFileSync(files.image.path);
const pathToSave = "public/profileImages/" + Nuser._id + "/" + imageName;
fs.writeFileSync(pathToSave, data);
await fs.unlinkSync(files.image.path);
return;
}
}
};
const Register = async (req, res) => {
req.method === "POST"
? handlePost(req, res)
: req.method === "PUT"
? console.log("PUT")
: req.method === "DELETE"
? console.log("DELETE")
: req.method === "GET"
? console.log("GET")
: res.status(404).send("");
};
export default Register;

handlePost处理函数不会等待form.parse回调执行(随后为res.json被调用),并将立即返回。为了防止这种情况,你可以用Promise包装form.parse,以确保处理程序等待回调函数执行。

const handlePost = async (req, res) => {
const form = formidable.IncomingForm();

await new Promise(function(resolve, reject) {
form.parse(req, async function(err, fields, files) {
await fileSavour(field, files);
resolve();
});
});
res.json({ message: "success" });
};

您需要承诺form.parse函数。目前,您的请求是在表单被解析之前返回的。

让我们定义一个函数,它承诺使用formidable进行表单解析,并使用它来解析所有请求。函数应该是这样的-

const promisifiedParseForm = (req) => {
const form = formidable.IncomingForm();
return new Promise((resolve, reject) => {
form.parse(req, function (err, field, files) {
if (err) {
reject(err)
} else {
resolve({ field, files })
}
});
});
}

handlePost函数中使用promisifiedParseForm函数,如下-

const handlePost = async (req, res) => {
const { field, files } = await promisifiedParseForm(req);

await fileSavour(field, files);
return res.json({
message: "success",
});
};