Estoy tratando de enviar res.json después de guardar con éxito los datos en la base de datos y guardar la carga de la imagen, pero constantemente API resolved without sending a response for /api/auth/registeration, this may result in stalled requests. . También estoy usando formidable para cargar imágenes en Next.js.
código:
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;La función del controlador handlePost no esperará a que se ejecute la devolución de llamada de form.parse (y, posteriormente, a que se llame a res.json ), y regresará inmediatamente. Para evitar esto, puede envolver form.parse con una Promesa para asegurarse de que el controlador espere a que se ejecute la función de devolución de llamada.
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" }); };Debe prometer la función form.parse . Actualmente, su solicitud se devuelve antes de que se analice el formulario.
Definamos una función que prometa el análisis de formularios usando formidable y usémosla para analizar todas las solicitudes. La función debería verse así:
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 }) } }); }); } Use la función promisifiedParseForm en la función handlePost , así:
const handlePost = async (req, res) => { const { field, files } = await promisifiedParseForm(req); await fileSavour(field, files); return res.json({ message: "success", }); };